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
|
#!/usr/bin/env python3
from itertools import takewhile
from fileinput import input
inp = map(str.strip, input())
rs = [tuple(map(int, r.split("-"))) for r in takewhile(bool, inp)]
ids = list(map(int, inp))
def add(a: int, b: int, c: int, d: int) -> tuple[int, int] | None:
if c < a:
return add(c, d, a, b)
if b < c:
return None
return (a, max(b, d))
done = False
while not done:
ms = []
for r in rs:
for idx, m in enumerate(ms):
if new := add(*r, *m):
ms[idx] = new
break
else:
ms.append(r)
done = len(rs) == len(ms)
rs = ms
silver = sum(1 for i in ids if any(lo <= i <= hi for lo, hi in rs))
gold = sum(b - a + 1 for a, b in rs)
print("silver:", silver)
print("gold:", gold)
|