advent-of-code/2017-python/solutions/day_20.py

63 lines
1.9 KiB
Python
Raw Normal View History

2021-11-01 16:40:46 +01:00
import re
import collections
from solutions import BaseSolution
class Solution(BaseSolution):
2025-05-06 20:14:58 +02:00
input_file = "20.txt"
2021-11-01 16:40:46 +01:00
def __str__(self):
2025-05-06 20:14:58 +02:00
return "Day 20: Particle Swarm"
2021-11-01 16:40:46 +01:00
def _get_particle(self, line):
2025-05-06 20:14:58 +02:00
return [
list(map(int, coordinate.split(",")))
for coordinate in re.findall(r".=<([^>]+)>", line)
]
2021-11-01 16:40:46 +01:00
2025-05-06 20:14:58 +02:00
def solve(self, puzzle_input, ticks=10**4):
2021-11-01 16:40:46 +01:00
particles = [self._get_particle(line) for line in puzzle_input.splitlines()]
distances = [[] for _ in range(len(particles))]
for _ in range(ticks):
for i, particle in enumerate(particles):
p, v, a = particle
v[0] += a[0]
v[1] += a[1]
v[2] += a[2]
p[0] += v[0]
p[1] += v[1]
p[2] += v[2]
distances[i].append(sum(map(abs, p)))
2025-05-06 20:14:58 +02:00
d = sorted(
map(lambda d: (d[0], sum(d[1]) / len(d[1])), enumerate(distances)),
key=lambda x: x[1],
)
2021-11-01 16:40:46 +01:00
return d[0][0]
2025-05-06 20:14:58 +02:00
def solve_again(self, puzzle_input, ticks=10**3):
2021-11-01 16:40:46 +01:00
particles = [self._get_particle(line) for line in puzzle_input.splitlines()]
for _ in range(ticks):
positions = collections.defaultdict(list)
for particle in particles:
p, v, a = particle
v[0] += a[0]
v[1] += a[1]
v[2] += a[2]
p[0] += v[0]
p[1] += v[1]
p[2] += v[2]
2025-05-06 20:14:58 +02:00
k = "-".join(map(str, p))
2021-11-01 16:40:46 +01:00
positions[k].append(particle)
for duplicates in positions.values():
if len(duplicates) > 1:
for d in duplicates:
particles.remove(d)
return len(particles)
2025-05-06 20:14:58 +02:00
if __name__ == "__main__":
2021-11-01 16:40:46 +01:00
solution = Solution()
solution.show_results()