use bytes::{equal}; use fmt; use io; use os; use strconv; use strings::{cut, fromutf8_unsafe, rtrim, split, toutf8}; fn u64revdigits(u: u64) ([]u8, size) = { static let buf: [64]u8 = [0...]; let length = 0z; for (u > 0u64) { buf[length] = (u % 10): u8; length += 1; u /= 10; }; return (buf, length); }; fn has_repeating_seq(num: u64) bool = { if (num < 11) return false; 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: []u8 = num_bytes[..chunk_size]; let valid_seq = true; 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; }; }; 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)!; for (let num = start; num <= end; num += 1) { if (has_repeating_seq(num)) answer += num; }; }; fmt::printfln("Answer: {}", answer)!; };