#!/usr/bin/env python from scanf import scanf from collections import Counter my_particles = [] a = None b = None c = None d = None e = None f = None g = None h = None i = None with open("/home/login/bin/advent17/input20.txt") as f: for line in f: a,b,c,d,e,f,g,h,i = scanf("p=<%d,%d,%d>, v=<%d,%d,%d>, a=<%d,%d,%d>",s=line[:-1]) my_particles.append({'x':[a,b,c], 'v':[d,e,f], 'a':[g,h,i]}) # Simulate for Part 1! # Somehow works # Remove all instances of "###" (without quotes) # For Part 1 # Currently, this program outputs Part 2 steps = 1000 def update_particle(particle): particle['v'][0] += particle['a'][0] particle['v'][1] += particle['a'][1] particle['v'][2] += particle['a'][2] particle['x'][0] += particle['v'][0] particle['x'][1] += particle['v'][1] particle['x'][2] += particle['v'][2] ###for step in range(0,steps): ### map(update_particle, my_particles) ###my_id_p1, my_p1 = min(enumerate(my_particles), key=lambda particle: abs(particle[1]['x'][0]) + abs(particle[1]['x'][1]) + abs(particle[1]['x'][2])) ## Analytical solution for Part 1 ## Doesn't work, not sure why ##my_id_p1, my_p1 = min(enumerate([sum(map(lambda x,y: x*y, particle['a'], particle['x']))/(1.0*(particle['x'][0]**2 + particle['x'][1]**2 + particle['x'][2]**2))**(1.0*0.5) for particle in my_particles]), key=lambda x: abs(x[1])) ###print("Part 1: " + str(my_id_p1) + " " + str(my_p1)) # Part 2! for step in range(0,steps): # Check for collisions reduced_particle_list = [str(particle['x']) for particle in my_particles] reduced_particle_list_count = Counter(reduced_particle_list) for key,value in reduced_particle_list_count.items(): if value > 1: while value > 0: index = reduced_particle_list.index(key) del reduced_particle_list[index] del my_particles[index] value -= 1 map(update_particle, my_particles) print("Part 2: " + str(len(my_particles)))