diff options
| author | Polesznyák Márk <contact@pml68.dev> | 2025-12-27 01:20:00 +0100 |
|---|---|---|
| committer | Polesznyák Márk <contact@pml68.dev> | 2025-12-27 21:24:18 +0100 |
| commit | fb52beee539e44ffd42107fc6882bbd7795312dd (patch) | |
| tree | daa6e643726467ec31dac162f8c1e67c1c5100a4 | |
| parent | feat: day6 part1 complete (diff) | |
| download | aoc-2025.tar.gz | |
| -rw-r--r-- | day2/part2/main.ha | 50 |
1 files changed, 23 insertions, 27 deletions
diff --git a/day2/part2/main.ha b/day2/part2/main.ha index 4778240..415295d 100644 --- a/day2/part2/main.ha +++ b/day2/part2/main.ha @@ -1,43 +1,42 @@ +use bytes::{equal}; use fmt; use io; -use math::{ceilf64, log10f64}; use os; use strconv; -use strings::{cut, dup, freeall, fromutf8_unsafe, rtrim, split, sub}; +use strings::{cut, fromutf8_unsafe, rtrim, split, toutf8}; -fn digits(num: u64) u8 = { - return ceilf64(log10f64(num: f64)): u8; -}; +fn u64revdigits(u: u64) ([]u8, size) = { + static let buf: [64]u8 = [0...]; -fn has_repeating_seq(num: u64) bool = { - let digits = digits(num); + let length = 0z; + + for (u > 0u64) { + buf[length] = (u % 10): u8; + length += 1; + u /= 10; + }; - if (digits == 1) return false; + return (buf, length); +}; - let divisors: []u8 = []; - defer free(divisors); +fn has_repeating_seq(num: u64) bool = { + if (num < 11) return false; - let num_str = strconv::u64tos(num); + let (num_bytes, digits) = u64revdigits(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 first_chunk: []u8 = num_bytes[..chunk_size]; 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; - }; + for (let j: u8 = 1; j < i; j += 1) { + let chunk = num_bytes[chunk_size * j..chunk_size * (j + 1)]; + + if (!equal(chunk, first_chunk)) { + valid_seq = false; + break; }; }; @@ -66,9 +65,6 @@ export fn main() void = { 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; }; |
