summaryrefslogtreecommitdiff
path: root/aoc/2025/02/python.py
diff options
context:
space:
mode:
Diffstat (limited to 'aoc/2025/02/python.py')
-rwxr-xr-xaoc/2025/02/python.py33
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)