-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathday20.py
64 lines (50 loc) · 2 KB
/
day20.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
from typing import List
from operator import add
def parse_input(filename: str) -> List[List[List[int]]]:
lines = [line.strip() for line in open(filename).readlines()]
particles = []
for line in lines:
p, v, a = line.split(', ')
p = [int(d) for d in p[3:-1].split(',')]
v = [int(d) for d in v[3:-1].split(',')]
a = [int(d) for d in a[3:-1].split(',')]
particles.append([p, v, a])
return particles
def part1(particles: List[List[List[int]]]) -> int:
for j in range(1000):
for i in range(len(particles)):
particles[i][1] = list(map(add, particles[i][1], particles[i][2]))
particles[i][0] = list(map(add, particles[i][0], particles[i][1]))
min_distance, closest_particle = float('inf'), -1
for i in range(len(particles)):
distance = sum(abs(d) for d in particles[i][0])
if distance < min_distance:
min_distance = distance
closest_particle = i
return closest_particle
def part2(particles: List[List[List[int]]]) -> int:
for j in range(1000):
seen = set()
to_remove = set()
for i in range(len(particles)):
particles[i][1] = list(map(add, particles[i][1], particles[i][2]))
particles[i][0] = list(map(add, particles[i][0], particles[i][1]))
if tuple(particles[i][0]) in seen:
to_remove.add(tuple(particles[i][0]))
else:
seen.add(tuple(particles[i][0]))
particles_to_remove = []
for p in to_remove:
for particle in particles:
if particle[0] == list(p):
particles_to_remove.append(particle)
for particle in particles_to_remove:
particles.remove(particle)
return len(particles)
def main():
particles = parse_input('input/day20.txt')
print(f'Part 1: {part1(particles)}')
particles = parse_input('input/day20.txt')
print(f'Part 2: {part2(particles)}')
if __name__ == "__main__":
main()