diff --git a/2023/day8/part2.py b/2023/day8/part2.py index fed123e..bf7a883 100644 --- a/2023/day8/part2.py +++ b/2023/day8/part2.py @@ -5,6 +5,7 @@ import sys from pprint import pprint from collections import Counter import numpy as np +from math import lcm input_f = sys.argv[1] @@ -12,53 +13,31 @@ def pp(x): for i in x: print(nodes[i].value,nodes[i].left,nodes[i].right) - - d, *maps = open(input_f).read().split('\n') - class Node(): def __init__(self,value,left,right): self.value = value self.left = left self.right = right -s = [] -l = [] -r = [] - -maps = maps - nodes = {} for i in maps: if i == '': continue - s = i[:3] - l = i[7:10] - r = i[12:15] - nodes[s] = Node(s,l,r) + nodes[i[:3]] = Node(i[:3],i[7:10],i[12:15]) current = 'AAA' steps = 0 count = 0 -try: - while current != 'ZZZ': - steps += 1 - current = nodes[current].left if d[count%len(d)] == 'L' else nodes[current].right - count += 1 - print(steps) -except: - print() +while current != 'ZZZ': + steps += 1 + current = nodes[current].left if d[count%len(d)] == 'L' else nodes[current].right + count += 1 +print('Part 1: ',end='') +print(steps) -def done(x): - print(x) - for i in x: - if not i.endswith('Z'): - return False - return True - -pp(nodes) current = [] for i in nodes: @@ -66,15 +45,14 @@ for i in nodes: current.append(i) count = 0 steps = 0 -while not done(current): - steps += 1 - for i in range(len(current)): - if d[count%len(d)] == 'L': - #print("Going left from " + str(current[i]) + " to " + str(nodes[current[i]].left)) - current[i] = nodes[current[i]].left - else: - #print("Going right from " + str(current[i]) + " to " + str(nodes[current[i]].right)) - current[i] = nodes[current[i]].right +total_s = [] +for i in current: + count = 0 + steps = 0 + while not i.endswith('Z'): + steps += 1 + i = nodes[i].left if d[count%len(d)] == 'L' else nodes[i].right count += 1 -print(steps) - + total_s.append(steps) +print("Part 2: ",end='') +print(lcm(*total_s))