diff options
| author | Polesznyák Márk <contact@pml68.dev> | 2025-12-03 02:54:25 +0100 |
|---|---|---|
| committer | Polesznyák Márk <contact@pml68.dev> | 2025-12-03 02:54:25 +0100 |
| commit | 430172f51ec902c9a4679b89745d240ff326d8e3 (patch) | |
| tree | f0eaf5109f11135d7c26046bf8e3942b5cbf3df8 | |
| parent | feat: day2 part1 complete (diff) | |
| download | aoc-430172f51ec902c9a4679b89745d240ff326d8e3.tar.gz | |
feat: day2 part2 complete
| -rw-r--r-- | day2/part2/main.ha | 78 |
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)!; +}; |
