Onderweg naar de Kerstman passeer je langs Jupiter, die verschillende manen heeft. De vier meest prominente zijn Io, Europa, Ganymedes en Callisto. Na een korte scan, slaag je erin om de positie van deze vier manen te berekenen. Dit laat je toe om hun beweging te berekenen, zodat je ze kunt vermijden.
Elke maan heeft een driedimensionale positie (x, y, z) en een snelheid (v_x, v_y, v_z). De positie is gekend, terwijl de snelheid initieel op nul start. De beweging van de manen kan gesimuleerd worden in tijdsstappen. Binnen elke tijdsstap wordt eerst de snelheid van alle manen geüpdatet, door per koppel van manen de snelheid aan te passen op basis van hun onderlinge positie. De snelheid wordt hierbij geüpdatet met +1 en -1, zodat de manen naar elkaar toe versnellen. Als Ganymedes bijvoorbeeld een x-waarde van 3 heeft en Callisto een waarde van 5, wordt de snelheid van Ganymedes verhoogd met 1 en die van Callisto verlaagd met 1. Als de posities op een bepaalde as dezelfde zijn, verandert de snelheid voor dat koppel manen niet. Zodra alle snelheden aangepast werden, kunnen de posities geüpdatet worden. Daartoe tel je gewoon de snelheid van alle manen op bij hun posities. Als Europa bijvoorbeeld een positie (x=1, y=2, z=3) heeft en een snelheid van (v_x=-2, v_y=0, v_z=3), worden de nieuwe coördinaten (x=-1, y=-2, z=-6). Dit proces verandert de snelheid van de manen niet.
Stel dat de manen de volgende onderlinge posities hebben:
(x=-1, y= 0, z= 2) (x= 2, y=-10, z=-7) (x= 4, y= -8, z= 8) (x= 3, y= 5, z=-1)
Simuleren van de beweging van de manen, leidt dan tot het volgende:
Na nul stappen:
pos=(x=-1, y= 0, z= 2), snelh=(v_x=0, v_y=0, v_z=0) pos=(x= 2, y=-10, z=-7), snelh=(v_x=0, v_y=0, v_z=0) pos=(x= 4, y= -8, z= 8), snelh=(v_x=0, v_y=0, v_z=0) pos=(x= 3, y= 5, z=-1), snelh=(v_x=0, v_y=0, v_z=0)
Na één stap:
pos=(x= 2, y=-1, z= 1), snelh=(v_x= 3, v_y=-1, v_z=-1) pos=(x= 3, y=-7, z=-4), snelh=(v_x= 1, v_y= 3, v_z= 3) pos=(x= 1, y=-7, z= 5), snelh=(v_x=-3, v_y= 1, v_z=-3) pos=(x= 2, y= 2, z= 0), snelh=(v_x=-1, v_y=-3, v_z= 1)
Na twee stappen:
pos=(x= 5, y=-3, z=-1), snelh=(v_x= 3, v_y=-2, v_z=-2) pos=(x= 1, y=-2, z= 2), snelh=(v_x=-2, v_y= 5, v_z= 6) pos=(x= 1, y=-4, z=-1), snelh=(v_x= 0, v_y= 3, v_z=-6) pos=(x= 1, y=-4, z= 2), snelh=(v_x=-1, v_y=-6, v_z= 2)
...
Na tien stappen:
pos=(x= 2, y= 1, z=-3), snelh=(v_x=-3, v_y=-2, v_z= 1) pos=(x= 1, y=-8, z= 0), snelh=(v_x=-1, v_y= 1, v_z= 3) pos=(x= 3, y=-6, z= 1), snelh=(v_x= 3, v_y= 2, v_z=-3) pos=(x= 2, y= 0, z= 4), snelh=(v_x= 1, v_y=-1, v_z=-1)
...
Na duizend stappen:
pos=(x= 2, y=-2, z= 1), snelh=(v_x=-3, v_y=-4, v_z=-3) pos=(x= 1, y=-4, z= 4), snelh=(v_x=-1, v_y= 3, v_z=-1) pos=(x= 3, y=-7, z=-3), snelh=(v_x= 3, v_y= 2, v_z= 1) pos=(x= 2, y= 0, z= 0), snelh=(v_x= 1, v_y=-1, v_z= 3)
Na elke tijdsstap kunnen we de totale energie van de vier manen berekenen. De totale energie van een van de manen is gelijk aan de som van haar potentiële en kinetische energie. De potentiële energie is gelijk aan de som van de absolute waarden van de x-, y- en z-coördinaten, de kinetische energie is gelijk aan de som van de absolute waarden van de snelheidscoördinaten. Bijvoorbeeld:
pot: 2 + 2 + 1 = 5; kin: 3 + 4 + 3 = 10; tot: 5 * 10 = 50 pot: 1 + 4 + 4 = 9; kin: 1 + 3 + 1 = 5; tot: 9 * 5 = 45 pot: 3 + 7 + 3 = 13; kin: 3 + 2 + 1 = 6; tot: 13 * 6 = 78 pot: 2 + 0 + 0 = 2; kin: 1 + 1 + 3 = 5; tot: 2 * 5 = 10
De totale energie bedraagt dan 50 + 45 + 78 + 10 = 183. Gevraagd wordt nu om een functie "energie" te implementeren, die als input een lijst van strings heeft (de coördinaten), en als ouput een geheel getal (de totale energie na 1000 tijdsstappen) teruggeeft. Bijvoorbeeld:
energie(["(x=-1, y=0, z=2)", "(x=2, y=-10, z=-7)", "(x=4, y=-8, z=8)", "(x=3, y=5, z=-1)"]) # 183