| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- #!/usr/bin/env python3
- import sys
- import re
- def parse(f):
- p, v, a = [], [], []
- for line in f:
- nums = list(map(int, re.findall(r'-?[0-9]+', line)))
- p += nums[:3]
- v += nums[3:6]
- a += nums[6:]
- return p, v, a
- def closest_after_steps(p, v, a, steps):
- p = p.copy()
- v = v.copy()
- for step in range(steps):
- for i in range(len(p)):
- v[i] += a[i]
- p[i] += v[i]
- p = list(map(abs, p))
- d = [sum(p[i:i + 3]) for i in range(0, len(p), 3)]
- return d.index(min(d))
- def not_collided_after_steps(p, v, a, steps):
- p = p.copy()
- v = v.copy()
- collided = [False] * len(p)
- for step in range(steps):
- for i in range(len(p)):
- if not collided[i]:
- v[i] += a[i]
- p[i] += v[i]
- seen = {}
- for i in range(0, len(p), 3):
- if not collided[i]:
- pos = tuple(p[i:i + 3])
- seen.setdefault(pos, []).append(i)
- for indices in seen.values():
- if len(indices) > 1:
- for i in indices:
- collided[i] = True
- collided[i + 1] = True
- collided[i + 2] = True
- return collided.count(False) // 3
- # part 1
- p, v, a = parse(sys.stdin)
- print(closest_after_steps(p, v, a, 500))
- # part 2
- print(not_collided_after_steps(p, v, a, 500))
|