From 9fac61bdd548f1d3bd83ccfccdc68f970f16e385 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 2 Dec 2025 10:25:47 +0000 Subject: [PATCH] 2025: d02: ex2: add solution --- 2025/d02/ex2/ex2.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100755 2025/d02/ex2/ex2.py diff --git a/2025/d02/ex2/ex2.py b/2025/d02/ex2/ex2.py new file mode 100755 index 0000000..e4120ff --- /dev/null +++ b/2025/d02/ex2/ex2.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +import math +import sys +from collections.abc import Iterator + + +def solve(input: str) -> int: + def parse_range(input: str) -> tuple[int, int]: + start, end = input.split("-") + return int(start), int(end) + + def parse(input: str) -> list[tuple[int, int]]: + return [parse_range(r) for r in input.split(",")] + + def iter_invalids(start: int, end: int) -> Iterator[int]: + for n in range(start, end): + digits = int(math.log10(n)) + 1 + for repeat in range(2, digits + 1): + if digits % repeat != 0: + continue + cycle = digits // repeat + base = (10**digits - 1) / (10**cycle - 1) + if n % base == 0: + yield n + break # Don't yield the same digit twice + + ranges = parse(input) + return sum(sum(iter_invalids(start, end + 1)) for start, end in ranges) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main()