import re from tracemalloc import start import numpy as np import graphviz def get_answer(graph, keys, inst): inst_idx = 0 steps = 0 current_keys = keys while True: all_ending_in_z = True for i in range(len(current_keys)): current_keys[i] = graph[current_keys[i]][inst[inst_idx]] if all_ending_in_z and (current_keys[i][2] != 'Z'): all_ending_in_z = False steps += 1 inst_idx = (inst_idx + 1)%len(inst) if all_ending_in_z: return steps def visualize_graph(graph): dot = graphviz.Digraph(comment='Advent of Code Day 8') for i in graph: for key in graph[i].keys(): dot.node(i) dot.edge(i, graph[i][key]) dot.render('day8.dot') f = open('input.txt', 'r') my_graph = dict(dict()) content = f.read() lines = content.splitlines() instructions = [] starting_keys = [] ending_keys = [] for line_count, line in enumerate(lines): last_repeat = False if line_count == 0: instructions = line else: numbers = re.findall(r'[A-Za-z]+', line) if len(numbers) == 3: if numbers[0][2] == 'A': starting_keys.append(numbers[0]) my_graph[numbers[0]] = {"L": numbers[1], "R": numbers[2]} counters = [0]*len(starting_keys) inst_idx = 0 steps = 0 # current_keys = starting_keys # while True: # all_ending_in_z = True # for i in range(len(current_keys)): # current_keys[i] = my_graph[current_keys[i]][instructions[inst_idx]] # if all_ending_in_z and (current_keys[i][2] != 'Z'): # all_ending_in_z = False # steps += 1 # inst_idx = (inst_idx + 1)%len(instructions) # if all_ending_in_z: # return steps starting_key = 'AAA' ending_key = 'ZZZ' inst_idx = 0 list_steps = [] for key in starting_keys: steps = 0 current_key = key loop = True while loop: current_key = my_graph[current_key][instructions[inst_idx]] inst_idx = (inst_idx + 1)%len(instructions) if (current_key[2] == 'Z'): loop = False steps += 1 print(steps) list_steps.append(steps) # print(starting_keys) # ans = get_answer(my_graph, starting_keys, instructions) # print(ans) visualize_graph(my_graph) lcm = 1#np.lcm(list_steps[0], list_steps[1]) print(lcm) for i in range(len(list_steps)): lcm = np.lcm(lcm, list_steps[i]) print(lcm) print(list_steps[i]/len(instructions)) f.close()