package main import "core:math/linalg" import "core:container/queue" import "core:fmt" import "core:math" import "core:os" import "core:slice" import "core:strconv" import "core:strings" import "core:time" import "core:unicode/utf8" import util "../util" Range :: struct { low: int, high: int, } in_range_inclusive :: proc(a, l, h: $T) -> bool { return a >= l && a <= h } part_1 :: proc(lines: []string) { result := 0 split_idx, _ := slice.linear_search(lines, "") ranges, ids := slice.split_at(lines, split_idx) fresh_ranges, _ := slice.mapper(ranges, proc(range: string) -> Range { parts := strings.split(range, "-") low, _ := strconv.parse_int(parts[0]) high, _ := strconv.parse_int(parts[1]) return Range{low = low, high = high} }) ing_ids, _ := slice.mapper(ids, proc(id: string) -> int { ing_id, _ := strconv.parse_int(id) return ing_id }) for id in ing_ids { for r in fresh_ranges { if in_range_inclusive(id, r.low, r.high) { result += 1 break } } } fmt.printfln(" [Result] %v", result) } part_2 :: proc(lines: []string) { result := 0 split_idx, _ := slice.linear_search(lines, "") ranges, _ := slice.split_at(lines, split_idx) fresh_ranges, _ := slice.mapper(ranges, proc(range: string) -> Range { parts := strings.split(range, "-") low, _ := strconv.parse_int(parts[0]) high, _ := strconv.parse_int(parts[1]) return Range{low = low, high = high} }) slice.sort_by(fresh_ranges, proc(a, b: Range) -> bool { return a.low < b.low }) current := fresh_ranges[0] for i in 1..