diff options
| author | Polesznyák Márk <contact@pml68.dev> | 2025-12-06 11:25:57 +0100 |
|---|---|---|
| committer | Polesznyák Márk <contact@pml68.dev> | 2025-12-06 11:25:57 +0100 |
| commit | 7af8bad4e5b6486c48c4e01b51ed753cb788896a (patch) | |
| tree | ad35720f45dfa17d6ddd23f31ad4e68dfb7a33ba /day5/part2/main.ha | |
| parent | docs: add README (diff) | |
| download | aoc-7af8bad4e5b6486c48c4e01b51ed753cb788896a.tar.gz | |
feat: day5 part2 complete
Diffstat (limited to 'day5/part2/main.ha')
| -rw-r--r-- | day5/part2/main.ha | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/day5/part2/main.ha b/day5/part2/main.ha new file mode 100644 index 0000000..4f38b58 --- /dev/null +++ b/day5/part2/main.ha @@ -0,0 +1,74 @@ +use fmt; +use io; +use os; +use sort; +use sort::cmp; +use strconv::{stou64}; +use strings::{cut, fromutf8_unsafe, split}; + +fn cmpranges(a: const *opaque, b: const *opaque) int = { + const a = *(a: const *(u64, u64)), b = *(b: const *(u64, u64)); + return if (a.0 < b.0) -1 + else if (a.0 > b.0) 1 + else if (a.1 < b.1) -1 + else if (a.1 > b.1) 1 + else 0; +}; + +fn fresh_ingredients(fresh_ranges: [](u64, u64)) u64 = { + let ingredients: u64 = 0; + + sort::sort(fresh_ranges: []opaque, size((u64, u64)), &cmpranges)!; + + let i: size = 0; + + for (true) { + for (true) { + if (fresh_ranges[i].1 >= fresh_ranges[i + 1].0) { + if (fresh_ranges[i].1 < fresh_ranges[i + 1].1) + fresh_ranges[i].1 = fresh_ranges[i + 1].1; + delete(fresh_ranges[i + 1]); + } else break; + }; + + if (i < len(fresh_ranges) - 2) i += 1 + else break; + }; + + for (let range .. fresh_ranges) { + ingredients += (range.1 - range.0) + 1; + }; + + free(fresh_ranges); + + return ingredients; +}; + +export fn main() void = { + let handle = os::open("input.txt")!; + defer io::close(handle)!; + + let buf = io::drain(handle)!; + defer free(buf); + + let lines = split(fromutf8_unsafe(buf), "\n")!; + defer free(lines); + + let ranges: [](u64, u64) = []; + + for (let line .. lines) { + if (line == "") + break; + + let range = cut(line, "-"); + + let start = stou64(range.0)!; + let end = stou64(range.1)!; + + append(ranges, (start, end))!; + }; + + let answer = fresh_ingredients(ranges); + + fmt::printfln("Answer: {}", answer)!; +}; |
