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)!; };