diff options
Diffstat (limited to 'aoc/2025/02/python.py')
| -rwxr-xr-x | aoc/2025/02/python.py | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/aoc/2025/02/python.py b/aoc/2025/02/python.py new file mode 100755 index 0000000..a3b4d1e --- /dev/null +++ b/aoc/2025/02/python.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 + + +from itertools import accumulate +from bisect import bisect_left, bisect_right +from functools import cache + +rs = [(int(a), int(b)) for r in input().split(",") for [a, b] in [r.split("-")]] +N = max(len(str(x)) for r in rs for x in r) + + +@cache +def memo(p2: bool): + ids = sorted( + { + int(str(n) * reps) + for n in range(10 ** (N // 2)) + for reps in range(2, N // len(str(n)) + 1 if p2 else 3) + } + ) + sums = list(accumulate(ids)) + return ids[1:], sums + + +def prefix_sum(a: int, b: int, ids: list[int], sums: list[int]): + return sums[bisect_right(ids, b)] - sums[bisect_left(ids, a)] + + +silver = sum(prefix_sum(*r, *memo(False)) for r in rs) +gold = sum(prefix_sum(*r, *memo(True)) for r in rs) + +print("silver:", silver) +print("gold:", gold) |
