Refactored day 12 with lib
parent
1d2a679eb8
commit
83ab3847e4
45
day12.py
45
day12.py
|
@ -1,53 +1,29 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from itertools import combinations
|
from itertools import combinations, starmap
|
||||||
from math import gcd
|
from math import gcd
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
|
|
||||||
|
from lib import vector
|
||||||
|
|
||||||
def lcm(a, b):
|
def lcm(a, b):
|
||||||
return (a * b) // gcd(a, b)
|
return (a * b) // gcd(a, b)
|
||||||
|
|
||||||
def comp(a, b):
|
def cmp(x, y):
|
||||||
def f(arg):
|
return (x < y) - (x > y)
|
||||||
x, y = arg
|
|
||||||
if x < y:
|
|
||||||
return 1
|
|
||||||
elif x == y:
|
|
||||||
return 0
|
|
||||||
return -1
|
|
||||||
return Vector(map(f, zip(a, b)))
|
|
||||||
|
|
||||||
def parse(line):
|
|
||||||
coords = (int(x[2:]) for x in line[1:-1].split(', '))
|
|
||||||
return Moon(coords)
|
|
||||||
|
|
||||||
class Vector(tuple):
|
|
||||||
|
|
||||||
def __add__(self, other):
|
|
||||||
return Vector(map(sum, zip(self, other)))
|
|
||||||
|
|
||||||
def __neg__(self):
|
|
||||||
return Vector((-x for x in self))
|
|
||||||
|
|
||||||
def __sub__(self, other):
|
|
||||||
return self + (- other)
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return super(Vector, self).__repr__()
|
|
||||||
|
|
||||||
class Moon:
|
class Moon:
|
||||||
def __init__(self, pos, vel=None):
|
def __init__(self, pos, vel=None):
|
||||||
self.pos = Vector(pos)
|
self.pos = vector(pos)
|
||||||
if vel == None:
|
if vel == None:
|
||||||
self.vel = Vector([0]*len(self.pos))
|
vel = vector([0]*len(self.pos))
|
||||||
else:
|
self.vel = vector(vel)
|
||||||
self.vel = Vector(vel)
|
|
||||||
|
|
||||||
def restrict(self, i):
|
def restrict(self, i):
|
||||||
return Moon((self.pos[i],), (self.vel[i],))
|
return Moon((self.pos[i],), (self.vel[i],))
|
||||||
|
|
||||||
def apply_gravity(self, b):
|
def apply_gravity(self, b):
|
||||||
self.vel += comp(self.pos, b.pos)
|
self.vel += starmap(cmp, zip(self.pos, b.pos))
|
||||||
|
|
||||||
def apply_velocity(self):
|
def apply_velocity(self):
|
||||||
self.pos += self.vel
|
self.pos += self.vel
|
||||||
|
@ -114,7 +90,10 @@ def find_period(sys):
|
||||||
return step
|
return step
|
||||||
return reduce(lcm, (find_period(sys.restrict(i))
|
return reduce(lcm, (find_period(sys.restrict(i))
|
||||||
for i in range(sys.dimension())))
|
for i in range(sys.dimension())))
|
||||||
|
|
||||||
|
|
||||||
def preproc(puzzle_input):
|
def preproc(puzzle_input):
|
||||||
|
parse = lambda line : Moon(int(x[2:]) for x in line[1:-1].split(', '))
|
||||||
return System(map(parse, puzzle_input.split('\n')))
|
return System(map(parse, puzzle_input.split('\n')))
|
||||||
|
|
||||||
def partI(moons):
|
def partI(moons):
|
||||||
|
|
Loading…
Reference in New Issue