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
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")
|
|
|
|
|