summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPolesznyák Márk <contact@pml68.dev>2025-12-27 01:20:00 +0100
committerPolesznyák Márk <contact@pml68.dev>2025-12-27 21:24:18 +0100
commitfb52beee539e44ffd42107fc6882bbd7795312dd (patch)
treedaa6e643726467ec31dac162f8c1e67c1c5100a4
parentfeat: day6 part1 complete (diff)
downloadaoc-2025.tar.gz
feat: day2 part2 solution runtime down to 400ms (from 4700)HEAD2025
-rw-r--r--day2/part2/main.ha50
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;
};