62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
import re
|
|
|
|
import collections
|
|
|
|
from solutions import BaseSolution
|
|
|
|
|
|
class Solution(BaseSolution):
|
|
input_file = "20.txt"
|
|
|
|
def __str__(self):
|
|
return "Day 20: Particle Swarm"
|
|
|
|
def _get_particle(self, line):
|
|
return [
|
|
list(map(int, coordinate.split(",")))
|
|
for coordinate in re.findall(r".=<([^>]+)>", line)
|
|
]
|
|
|
|
def solve(self, puzzle_input, ticks=10**4):
|
|
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)))
|
|
d = sorted(
|
|
map(lambda d: (d[0], sum(d[1]) / len(d[1])), enumerate(distances)),
|
|
key=lambda x: x[1],
|
|
)
|
|
return d[0][0]
|
|
|
|
def solve_again(self, puzzle_input, ticks=10**3):
|
|
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]
|
|
k = "-".join(map(str, p))
|
|
positions[k].append(particle)
|
|
for duplicates in positions.values():
|
|
if len(duplicates) > 1:
|
|
for d in duplicates:
|
|
particles.remove(d)
|
|
return len(particles)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
solution = Solution()
|
|
solution.show_results()
|