This repository was archived by the owner on Dec 12, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path202502.py
More file actions
51 lines (40 loc) · 1.34 KB
/
202502.py
File metadata and controls
51 lines (40 loc) · 1.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from bisect import bisect_right
from operator import itemgetter
input = []
with open("202502.txt", "r") as f:
ranges = f.readline().strip().split(",")
input = sorted(
map(lambda p: tuple(map(int, p.split("-"))), ranges),
key=itemgetter(0),
)
def generate_invalid(max_val: int) -> dict[int, bool]:
invalid = dict()
max_digits = len(str(max_val))
for plen in range(1, max_digits + 1):
max_reps = max_digits // plen
start = max(1, 10 ** (plen - 1))
for reps in range(2, max_reps + 1):
for p in range(start, 10**plen):
num = int(str(p) * reps)
if num > max_val:
break
if num not in invalid or not invalid[num]:
invalid[num] = reps == 2
return invalid
# input must be sorted
def solve(input: list[tuple[int, int]]) -> tuple[int, int]:
part_one = 0
part_two = 0
invalid = generate_invalid(input[-1][1])
starts = [a for a, _ in input]
for num, is_part_one in invalid.items():
idx = bisect_right(starts, num) - 1
if idx >= 0:
a, b = input[idx]
if a <= num <= b:
part_two += num
part_one += num if is_part_one else 0
return part_one, part_two
solution = solve(input)
print(solution[0])
print(solution[1])