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()