-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrwhite_12.py
66 lines (64 loc) · 2.01 KB
/
rwhite_12.py
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
63
64
65
66
from operator import lt, eq, gt
from collections import defaultdict
from pprint import pprint
import math
data = open('day_12.input').read().split('\n')
# data="""<x=-1, y=0, z=2>
# <x=2, y=-10, z=-7>
# <x=4, y=-8, z=8>
# <x=3, y=5, z=-1>""".split('\n')
# data="""<x=-8, y=-10, z=0>
# <x=5, y=5, z=10>
# <x=2, y=-7, z=3>
# <x=9, y=-8, z=-3>""".split('\n')
pos = [tuple(int(p.split('=')[-1]) for p in line[1:-1].split(',')) for line in data]
vel = [(0, 0, 0) for i in range(4)]
states = [tuple(zip(pos, vel))]
for i in range(1000):
npos = []
nvel = []
energy = []
for p, v in states[-1]:
np = list(p)
nv = list(v)
for op, ov in states[-1]:
for idx, (x, y) in enumerate(zip(p, op)):
if x == y:
continue
elif x < y:
nv[idx] += 1
elif x > y:
nv[idx] += -1
np = [a+b for a, b in zip(p, nv)]
npos.append(tuple(np))
nvel.append(tuple(nv))
energy.append((sum(map(abs, np)) * sum(map(abs, nv))))
states.append(tuple(zip(npos, nvel)))
print('energy', sum(energy))
intervals = {}
for axis in range(3):
seen = set()
interval = 0
positions = [p[axis] for p in pos]
velocities = [s[axis] for s in vel]
while True:
axis_vals = tuple(positions) + tuple(velocities)
if axis_vals in seen:
intervals[axis] = interval
break
seen.add(axis_vals)
new_velocities = []
for p, v in zip(positions, velocities):
for op in positions:
if p == op:
continue
elif p < op:
v += 1
elif p > op:
v += -1
new_velocities.append(v)
velocities = new_velocities
positions = [a+b for a, b in zip(positions, velocities)]
interval += 1
lcm = (intervals[0] * intervals[1] // math.gcd(intervals[0], intervals[1]))
print(intervals[2] * lcm // math.gcd(intervals[2], lcm))