1
0
Fork 0

2017 day 20 part 2

This commit is contained in:
Lucidiot 2020-12-07 02:41:08 +01:00
parent 336341abce
commit 5cd65e1125
Signed by: lucidiot
GPG Key ID: 3358C1CA6906FB8D
1 changed files with 32 additions and 13 deletions

View File

@ -3,11 +3,6 @@
def man_dist(tup):
return sum(map(abs, tup))
import sys
import re
pattern = re.compile(r"<([0-9-]*),([0-9-]*),([0-9-]*)>")
data = [[(int(c[0]), int(c[1]), int(c[2])) for c in p] for p in [pattern.findall(l.strip()) for l in sys.stdin.readlines()]]
def update_particle(p):
return (
tuple(map(sum, zip(p[0], p[1]))),
@ -15,12 +10,36 @@ def update_particle(p):
p[2],
)
while True:
data = list(map(update_particle, data))
min_dist, min_p = None, None
for i, particle in enumerate(data):
md = man_dist(particle[0])
if min_p is None or md < min_dist:
min_p, min_dist = i, md
def part1(particles):
stability = 0
previous, min_p = None, None
while stability < 300:
previous = min_p
stability += 1
min_dist = None
particles = list(map(update_particle, particles))
for i, particle in enumerate(particles):
md = man_dist(particle[0])
if min_p is None or min_dist is None or md < min_dist:
min_p, min_dist = i, md
if previous != min_p:
stability = 0
print(min_p)
def part2(particles):
number = len(particles)
while True:
particles = list(map(update_particle, particles))
positions = next(zip(*particles))
if len(positions) != len(set(positions)):
particles = list(filter(lambda p: positions.count(p[0]) == 1, particles))
number = len(particles)
print(number)
if __name__ == '__main__':
import sys
import re
pattern = re.compile(r"<([0-9-]*),([0-9-]*),([0-9-]*)>")
data = [[(int(c[0]), int(c[1]), int(c[2])) for c in p] for p in [pattern.findall(l.strip()) for l in sys.stdin.readlines()]]
run = part2 if any(arg in map(str.strip, map(str.lower, sys.argv)) for arg in ('-c', '--collisions')) else part1
run(data)