def test_2b(): bodies = [ Body(Point3(-8,-10, 0)), Body(Point3( 5, 5,10)), Body(Point3( 2, -7, 3)), Body(Point3( 9, -8,-3)), ] assert until_repeat_steps(bodies) == 4686774924 print("passed test_2b")
def part_2(): bodies = [ Body(Point3(-1, -4, 0)), Body(Point3(4, 7, -1)), Body(Point3(-14, -10, 9)), Body(Point3(1, 2, 17)), ] ss = until_repeat_steps(bodies, debug=True) print(f"part 2: simulation will repeat after {ss} steps")
def test_2a(): bodies = [ Body(Point3(-1, 0, 2)), Body(Point3(2, -10, -7)), Body(Point3(4, -8, 8)), Body(Point3(3, 5, -1)) ] assert until_repeat_steps(bodies) == 2772 print("passed test_2a")
def part_1(steps=1000): bodies = [ Body(Point3(-1, -4, 0)), Body(Point3(4, 7, -1)), Body(Point3(-14, -10, 9)), Body(Point3(1, 2, 17)), ] last(simulate(bodies, steps_limit=steps)) total_energy = sum(b.energy for b in bodies) print(f"part 1: total energy after {steps} steps is {total_energy}")
def test_reverse(): bodies = [ Body(Point3(-1, 0, 2)), Body(Point3(2, -10, -7)), Body(Point3(4, -8, 8)), Body(Point3(3, 5, -1)) ] states_f = list(simulate(bodies, steps_limit=2772)) states_b = list(simulate_reverse(bodies, steps_limit=2772)) assert len(states_f) == len(states_b) == 2773 assert states_f[0] == states_b[0] assert states_f[0] == states_f[-1] assert states_b[0] == states_b[-1] assert states_f[1] == states_b[-2] assert states_f[2] == states_b[-3] assert states_f[1000] == states_b[-1001] print("passed test_reverse")
def test_1b(): bodies = [ Body(Point3(-8,-10, 0)), Body(Point3( 5, 5,10)), Body(Point3( 2, -7, 3)), Body(Point3( 9, -8,-3)), ] last_state = last(simulate(bodies, steps_limit=100)) assert last_state == ( (Point3( 8, -12, -9), Vector3(-7, 3, 0)), (Point3( 13, 16, -3), Vector3( 3, -11, -5)), (Point3(-29, -11, -1), Vector3(-3, 7, 4)), (Point3( 16, -13, 23), Vector3( 7, 1, 1)), ) assert sum(b.energy for b in bodies) == 1940 print("passed test_1b")
def from_str(cls, line: str) -> 'Particle': # 'p=<-201,-1266,-2683>, v=<-29,-181,-382>, a=<2,13,31>' vals = [int(val) for val in parse_line(line.strip(), "p=<$,$,$>, v=<$,$,$>, a=<$,$,$>")] assert len(vals) == 9 return cls(pos=Point3(*vals[:3]), vel=Vector3(*vals[3:6]), acc=Vector3(*vals[6:]))
def only_z(self): return Body(Point3(0, 0, self.pos.z), Vector3(0, 0, self.vel.z))
def only_y(self): return Body(Point3(0, self.pos.y, 0), Vector3(0, self.vel.y, 0))
def only_x(self): return Body(Point3(self.pos.x, 0, 0), Vector3(self.vel.x, 0, 0))
def test_1a(): bodies = [ Body(Point3(-1, 0, 2)), Body(Point3(2, -10, -7)), Body(Point3(4, -8, 8)), Body(Point3(3, 5, -1)) ] r = list(simulate(bodies, steps_limit=10)) assert len(r) == 11 assert r[1] == ( (Point3( 2, -1, 1), Vector3( 3, -1, -1)), (Point3( 3, -7, -4), Vector3( 1, 3, 3)), (Point3( 1, -7, 5), Vector3(-3, 1, -3)), (Point3( 2, 2, 0), Vector3(-1, -3, 1)), ) assert r[2] == ( (Point3( 5, -3, -1), Vector3( 3, -2, -2)), (Point3( 1, -2, 2), Vector3(-2, 5, 6)), (Point3( 1, -4, -1), Vector3( 0, 3, -6)), (Point3( 1, -4, 2), Vector3(-1, -6, 2)), ) assert r[3] == ( (Point3( 5, -6, -1), Vector3( 0, -3, 0)), (Point3( 0, 0, 6), Vector3(-1, 2, 4)), (Point3( 2, 1, -5), Vector3( 1, 5, -4)), (Point3( 1, -8, 2), Vector3( 0, -4, 0)), ) assert r[4] == ( (Point3( 2, -8, 0), Vector3(-3, -2, 1)), (Point3( 2, 1, 7), Vector3( 2, 1, 1)), (Point3( 2, 3, -6), Vector3( 0, 2, -1)), (Point3( 2, -9, 1), Vector3( 1, -1, -1)), ) assert r[5] == ( (Point3(-1, -9, 2), Vector3(-3, -1, 2)), (Point3( 4, 1, 5), Vector3( 2, 0, -2)), (Point3( 2, 2, -4), Vector3( 0, -1, 2)), (Point3( 3, -7, -1), Vector3( 1, 2, -2)), ) assert r[6] == ( (Point3(-1, -7, 3), Vector3( 0, 2, 1)), (Point3( 3, 0, 0), Vector3(-1, -1, -5)), (Point3( 3, -2, 1), Vector3( 1, -4, 5)), (Point3( 3, -4, -2), Vector3( 0, 3, -1)), ) assert r[7] == ( (Point3( 2, -2, 1), Vector3( 3, 5, -2)), (Point3( 1, -4, -4), Vector3(-2, -4, -4)), (Point3( 3, -7, 5), Vector3( 0, -5, 4)), (Point3( 2, 0, 0), Vector3(-1, 4, 2)), ) assert r[8] == ( (Point3( 5, 2, -2), Vector3( 3, 4, -3)), (Point3( 2, -7, -5), Vector3( 1, -3, -1)), (Point3( 0, -9, 6), Vector3(-3, -2, 1)), (Point3( 1, 1, 3), Vector3(-1, 1, 3)), ) assert r[9] == ( (Point3( 5, 3, -4), Vector3( 0, 1, -2)), (Point3( 2, -9, -3), Vector3( 0, -2, 2)), (Point3( 0, -8, 4), Vector3( 0, 1, -2)), (Point3( 1, 1, 5), Vector3( 0, 0, 2)), ) assert r[10] == ( (Point3( 2, 1, -3), Vector3(-3, -2, 1)), (Point3( 1, -8, 0), Vector3(-1, 1, 3)), (Point3( 3, -6, 1), Vector3( 3, 2, -3)), (Point3( 2, 0, 4), Vector3( 1, -1, -1)), ) assert sum(b.energy for b in bodies) == 179 print("passed test_1a")