Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

5 lat temu
5 lat temu
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import functools
  2. import itertools
  3. import re
  4. import sys
  5. from math import gcd
  6. def calculate_energy(moons, vels):
  7. return sum(
  8. sum(abs(p) for p in moon) * sum(abs(v) for v in vel)
  9. for moon, vel in zip(moons, vels)
  10. )
  11. def simulate(text, axes=slice(0, 3), lim=None):
  12. g = (int(n) for n in re.findall(r'-?\d+', text))
  13. moons = [point[axes] for point in zip(*[g] * 3)]
  14. vels = [[0, 0, 0] for m in moons]
  15. seen = set()
  16. for step in itertools.count():
  17. if lim is not None and step >= lim:
  18. break
  19. for (i, A), (j, B) in itertools.combinations(enumerate(moons), 2):
  20. dV = [max(a < b, 0) or -max(b < a, 0) for a, b in zip(A, B)]
  21. vels[i] = [v + d for v, d in zip(vels[i], dV)]
  22. vels[j] = [v - d for v, d in zip(vels[j], dV)]
  23. for i, moon in enumerate(moons):
  24. moons[i] = [p + v for p, v in zip(moons[i], vels[i])]
  25. key = str(moons) + str(vels)
  26. if key in seen:
  27. break
  28. seen.add(key)
  29. return step, calculate_energy(moons, vels)
  30. text = sys.stdin.read()
  31. _, energy = simulate(text, lim=1000)
  32. print(energy)
  33. nX, _ = simulate(text, axes=slice(0, 1))
  34. nY, _ = simulate(text, axes=slice(1, 2))
  35. nZ, _ = simulate(text, axes=slice(2, 3))
  36. lcm = functools.reduce(lambda a, b: a * b // gcd(a, b), [nX, nY, nZ])
  37. print(lcm)