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
52
53
54
55
56
57
58
59
60
61
62
|
import re
from fileinput import input
from itertools import groupby
from math import prod
XMAX, YMAX = 11, 7 # for test
XMAX, YMAX = 101, 103 # for aoc
robots = [
re.fullmatch(r"p=(\d+),(\d+) v=(-?\d+),(-?\d+)", line.strip()).groups()
for line in input()
]
robots = [
(complex(int(px), int(py)), complex(int(vx), int(vy))) for px, py, vx, vy in robots
]
def move(p, v, s):
e = p + v * s
return complex(e.real % XMAX, e.imag % YMAX)
def quad(x):
return (x.real < XMAX // 2, x.imag < YMAX // 2)
def is_quad(x):
return x.real != XMAX // 2 and x.imag != YMAX // 2
def draw(s):
print(f"Seconds passed: {s}")
moved = {move(p, v, s) for p, v in robots}
for x in range(XMAX):
for y in range(YMAX):
print(
"#" if complex(x, y) in moved else " ",
end="",
)
print()
print("-" * XMAX)
moved = groupby(
sorted(
filter(is_quad, (move(p, v, 100) for p, v in robots)),
key=quad,
),
quad,
)
silver = prod(sum(1 for _ in k) for _, k in moved)
gold = 0
print("silver:", silver)
print("gold:", gold)
s = 0
while s < 10_000:
draw(s)
s += 1
|