You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

51 lines
1.4 KiB

#!/usr/bin/env python3
import sys,re
from math import lcm
if __name__ == '__main__':
lines = [line.strip('\n') for line in open(sys.argv[1])]
lri = list(lines[0])
network = {}
start = []
for line in lines[2:]:
groups = re.search(r'(?P<start>.*) = \((?P<left>.*), (?P<right>.*)\)',line)
network[groups['start']] = (groups['left'], groups['right'])
if groups['start'][2] == 'A': start.append(groups['start'])
# challenge 1
s, e = 'AAA', 'ZZZ'
current = s
instr = 0
while current != e:
i = 0 if lri[instr%len(lri)] == 'L' else 1
current = network[current][i]
instr += 1
res1 = str(instr)
print(f"challenge 1:\n{res1}\n")
# challenge 2
instr = [0] * len(start)
ends = []
for i in range(len(start)):
ends.append([])
for a,s in enumerate(start):
current = s
while True:
i = 0 if lri[instr[a]%len(lri)] == 'L' else 1
current = network[current][i]
instr[a] += 1
if current[2] == 'Z':
b = False
for c,u in ends[a]:
if c == current and (instr[a] % u) == 0:
b = True
break
if b: break
ends[a].append((current, instr[a]))
res2 = str(lcm(*[e[0][1] for e in ends]))
print(f"challenge 2:\n{res2}\n")