···11import fileinput
22-from copy import deepcopy
32from itertools import count
4354from utils import parse_nums
657688-def gcd(a,b):
77+def gcd(a, b):
98 """Compute the greatest common divisor of a and b"""
109 while b > 0:
1110 a, b = b, a % b
1211 return a
1212+13131414def lcm(a, b):
1515 """Compute the lowest common multiple of a and b"""
···171718181919positions = []
2020+initial = []
2121+velocities = [[0] * 3 for _ in range(4)]
2222+2023for i, line in enumerate(fileinput.input()):
2124 line = line.strip()
2225 nums = parse_nums(line)
2326 positions.append(list(nums))
2424-2525-2626-velocities = [[0] * 3 for _ in range(4)]
2727+ initial.append(list(nums))
27282828-INIT_POS = deepcopy(positions)
2929-INIT_VEL = deepcopy(velocities)
3029CYCLES = [None, None, None]
31303232-for i in count(start=1):
3131+for step in count(start=1):
3332 # Update velocities
3433 for x in range(4):
3534 for y in range(x + 1, 4):
···4645 for d in range(3):
4746 positions[x][d] += velocities[x][d]
48474949- energy = 0
4848+ if step == 1000:
4949+ energy = 0
50505151- for pos, vel in zip(positions, velocities):
5252- pot = sum(abs(p) for p in pos)
5353- kin = sum(abs(p) for p in vel)
5454- energy += pot * kin
5151+ for pos, vel in zip(positions, velocities):
5252+ energy += sum(abs(p) for p in pos) * sum(abs(v) for v in vel)
55535656- if i == 1000:
5754 print "Total energy after 1000 steps:", energy
58555956 for d in range(3):
···6158 continue
62596360 for m in range(4):
6464- if positions[m][d] != INIT_POS[m][d]:
6161+ if positions[m][d] != initial[m][d]:
6562 break
6666- if velocities[m][d] != INIT_VEL[m][d]:
6363+ if velocities[m][d] != 0:
6764 break
6865 else:
6969- CYCLES[d] = i
6666+ CYCLES[d] = step
70677168 if all(CYCLES):
7269 print "Steps for full cycle:", lcm(lcm(CYCLES[0], CYCLES[1]), CYCLES[2])