예제 #1
0
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")
예제 #2
0
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")
예제 #3
0
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")
예제 #4
0
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}")
예제 #5
0
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")
예제 #6
0
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")
예제 #7
0
 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:]))
예제 #8
0
 def only_z(self):
     return Body(Point3(0, 0, self.pos.z), Vector3(0, 0, self.vel.z))
예제 #9
0
 def only_y(self):
     return Body(Point3(0, self.pos.y, 0), Vector3(0, self.vel.y, 0))
예제 #10
0
 def only_x(self):
     return Body(Point3(self.pos.x, 0, 0), Vector3(self.vel.x, 0, 0))
예제 #11
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")