Refactored 2019 day 12

This commit is contained in:
Akumatic 2019-12-13 01:20:48 +01:00
parent c2d2e635ad
commit a4db04926a
2 changed files with 17 additions and 19 deletions

View File

@ -1,4 +1,4 @@
# 2019 Day 12: Monitoring Station # 2019 Day 12: The N-Body Problem
Copyright (c) Eric Wastl Copyright (c) Eric Wastl
#### [Direct Link](https://adventofcode.com/2019/day/12) #### [Direct Link](https://adventofcode.com/2019/day/12)

View File

@ -12,23 +12,22 @@ def cmp(a,b):
class Moon: class Moon:
def __init__(self, pos): def __init__(self, pos):
self.pos = [pos[0], pos[1], pos[2]] self.pos = list(pos)
self.vel = [0] * 3 self.vel = [0] * 3
def changeGravity(self, other): def changeGravity(self, other):
x,y,z = cmp(self.pos[0], other.pos[0]), cmp(self.pos[1], other.pos[1]), cmp(self.pos[2], other.pos[2]) for i in range(3):
self.vel[0], other.vel[0] = self.vel[0] - x, other.vel[0] + x d = cmp(self.pos[i], other.pos[i])
self.vel[1], other.vel[1] = self.vel[1] - y, other.vel[1] + y self.vel[i] -= d
self.vel[2], other.vel[2] = self.vel[2] - z, other.vel[2] + z other.vel[i] += d
def move(self): def move(self):
self.pos[0] += self.vel[0] for i in range(3):
self.pos[1] += self.vel[1] self.pos[i] += self.vel[i]
self.pos[2] += self.vel[2]
def energy(self): def energy(self):
pot = abs(self.pos[0]) + abs(self.pos[1]) + abs(self.pos[2]) pot = sum([abs(p) for p in self.pos])
kin = abs(self.vel[0]) + abs(self.vel[1]) + abs(self.vel[2]) kin = sum([abs(v) for v in self.vel])
return pot, kin, pot * kin return pot, kin, pot * kin
def simulate(moons : list, steps = 1): def simulate(moons : list, steps = 1):
@ -46,21 +45,21 @@ def lcm(x, y):
return tmp // x return tmp // x
def part1(vals: list): def part1(vals: list):
moons = [Moon((val[0], val[1], val[2])) for val in vals] moons = [Moon(val) for val in vals]
simulate(moons, 1000) simulate(moons, 1000)
return sum([moon.energy()[2] for moon in moons]) return sum([moon.energy()[2] for moon in moons])
def part2(vals: list): def part2(vals: list):
dims = [0, 0, 0] dims = [0, 0, 0]
for i in range(3): for i in range(3):
moons = [Moon((val[0], val[1], val[2])) for val in vals] moons = [Moon(val) for val in vals]
oPos = [moons[0].pos[i], moons[1].pos[i], moons[2].pos[i], moons[3].pos[i]] oPos = [moon.pos[i] for moon in moons]
while 1: while 1:
simulate(moons) simulate(moons)
dims[i] += 1 dims[i] += 1
if [moons[0].pos[i], moons[1].pos[i], moons[2].pos[i], moons[3].pos[i]] == oPos and \ if [moon.pos[i] for moon in moons] == oPos and \
[moons[0].vel[i], moons[1].vel[i], moons[2].vel[i], moons[3].vel[i]] == [0, 0, 0, 0]: [moon.vel[i] for moon in moons] == [0, 0, 0, 0]:
break break
return lcm(dims[0], lcm(dims[1], dims[2])) return lcm(dims[0], lcm(dims[1], dims[2]))
@ -69,10 +68,9 @@ def test():
moons = [Moon(p) for p in ((-1,0,2), (2,-10,-7), (4,-8,8), (3,5,-1))] moons = [Moon(p) for p in ((-1,0,2), (2,-10,-7), (4,-8,8), (3,5,-1))]
simulate(moons, 10) simulate(moons, 10)
assert sum([moon.energy()[2] for moon in moons]) == 179 assert sum([moon.energy()[2] for moon in moons]) == 179
vpos, vvel = ((2,1,-3),(1,-8,0),(3,-6,1),(2,0,4)), ((-3,-2,1),(-1,1,3),(3,2,-3),(1,-1,-1)) vpos, vvel = ([2,1,-3],[1,-8,0],[3,-6,1],[2,0,4]), ([-3,-2,1],[-1,1,3],[3,2,-3],[1,-1,-1])
for i in range(4): for i in range(4):
assert vpos[i] == (moons[i].pos[0], moons[i].pos[1] ,moons[i].pos[2]) and \ assert vpos[i] == moons[i].pos and vvel[i] == moons[i].vel
vvel[i] == (moons[i].vel[0], moons[i].vel[1], moons[i].vel[2])
moons = [Moon(p) for p in ((-8,-10,0), (5,5,10), (2,-7,3), (9,-8,-3))] moons = [Moon(p) for p in ((-8,-10,0), (5,5,10), (2,-7,3), (9,-8,-3))]
simulate(moons,100) simulate(moons,100)
assert sum([moon.energy()[2] for moon in moons]) == 1940 assert sum([moon.energy()[2] for moon in moons]) == 1940