summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPolesznyák Márk <contact@pml68.dev>2025-12-06 11:25:57 +0100
committerPolesznyák Márk <contact@pml68.dev>2025-12-06 11:25:57 +0100
commit7af8bad4e5b6486c48c4e01b51ed753cb788896a (patch)
treead35720f45dfa17d6ddd23f31ad4e68dfb7a33ba
parentdocs: add README (diff)
downloadaoc-7af8bad4e5b6486c48c4e01b51ed753cb788896a.tar.gz
feat: day5 part2 complete
Diffstat (limited to '')
-rw-r--r--day5/part2/main.ha74
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)!;
+};