diff --git a/d05/main.odin b/d05/main.odin new file mode 100644 index 0000000..28e5fe7 --- /dev/null +++ b/d05/main.odin @@ -0,0 +1,104 @@ +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..