summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPolesznyák Márk <contact@pml68.dev>2025-12-03 02:54:25 +0100
committerPolesznyák Márk <contact@pml68.dev>2025-12-03 02:54:25 +0100
commit430172f51ec902c9a4679b89745d240ff326d8e3 (patch)
treef0eaf5109f11135d7c26046bf8e3942b5cbf3df8
parentfeat: day2 part1 complete (diff)
downloadaoc-430172f51ec902c9a4679b89745d240ff326d8e3.tar.gz
feat: day2 part2 complete
-rw-r--r--day2/part2/main.ha78
1 files changed, 78 insertions, 0 deletions
diff --git a/day2/part2/main.ha b/day2/part2/main.ha
new file mode 100644
index 0000000..4778240
--- /dev/null
+++ b/day2/part2/main.ha
@@ -0,0 +1,78 @@
+use fmt;
+use io;
+use math::{ceilf64, log10f64};
+use os;
+use strconv;
+use strings::{cut, dup, freeall, fromutf8_unsafe, rtrim, split, sub};
+
+fn digits(num: u64) u8 = {
+ return ceilf64(log10f64(num: f64)): u8;
+};
+
+fn has_repeating_seq(num: u64) bool = {
+ let digits = digits(num);
+
+ if (digits == 1) return false;
+
+ let divisors: []u8 = [];
+ defer free(divisors);
+
+ let num_str = strconv::u64tos(num);
+
+ for (let i: u8 = 2; i <= digits; i += 1) {
+ if (digits % i == 0) {
+ let chunk_size = digits / i;
+ let first_chunk: str = "";
+ defer free(first_chunk);
+
+ let valid_seq = true;
+
+ for (let j: u8 = 0; j < i; j += 1) {
+ let chunk = dup(sub(num_str, chunk_size * j,
+ chunk_size * j + chunk_size))!;
+
+ if (j == 0) {
+ first_chunk = chunk;
+ } else {
+ if (chunk != first_chunk) {
+ valid_seq = false;
+ break;
+ };
+ };
+ };
+
+ if (valid_seq) return true;
+ };
+ };
+
+ return false;
+};
+
+export fn main() void = {
+ let handle = os::open("input.txt")!;
+ defer io::close(handle)!;
+
+ let buf = io::drain(handle) as []u8;
+ defer free(buf);
+
+ let range_strings = split(fromutf8_unsafe(buf), ",")!;
+ defer free(range_strings);
+
+ let answer: u64 = 0;
+
+ for (let i: size = 0; i < len(range_strings); i += 1) {
+ let range_ends = cut(rtrim(range_strings[i], '\n'), "-");
+
+ let start = strconv::stou64(range_ends.0)!;
+ let end = strconv::stou64(range_ends.1)!;
+
+ let start_digits = digits(start);
+ let end_digits = digits(end);
+
+ for (let num = start; num <= end; num += 1) {
+ if (has_repeating_seq(num)) answer += num;
+ };
+ };
+
+ fmt::printfln("Answer: {}", answer)!;
+};