diff --git a/day08.py b/day08.py index 1613592..e836051 100644 --- a/day08.py +++ b/day08.py @@ -1,9 +1,23 @@ import math -from collections import defaultdict from tools.aoc import AOCDay from typing import Any +def get_steps_to_z(inst: str, nodes: dict, from_node: str) -> int: + i_len = len(inst) + cur_step = 0 + cur_node = from_node + while not cur_node.endswith("Z"): + if inst[cur_step % i_len] == "L": + cur_node = nodes[cur_node][0] + else: + cur_node = nodes[cur_node][1] + + cur_step += 1 + + return cur_step + + class Day(AOCDay): inputs = [ [ @@ -21,44 +35,20 @@ class Day(AOCDay): inst = self.getInput()[0] nodes = {} for line in self.getInput()[2:]: - node, pathhs = line.split(" = ") - pl, pr = pathhs.split(", ") + node, paths = line.split(" = ") + pl, pr = paths.split(", ") nodes[node] = (pl[1:], pr[:-1]) return inst, nodes def part1(self) -> Any: inst, nodes = self.parse_input() - cur_node = "AAA" - cur_step = 0 - while cur_node != "ZZZ": - dir = inst[cur_step % len(inst)] - if dir == "L": - cur_node = nodes[cur_node][0] - else: - cur_node = nodes[cur_node][1] - - cur_step += 1 - - return cur_step + return get_steps_to_z(inst, nodes, "AAA") def part2(self) -> Any: inst, nodes = self.parse_input() - i_len = len(inst) check_nodes = [x for x in nodes if x.endswith("A")] - z_steps = [] - for node in check_nodes: - cur_step = 0 - cur_node = node - while not cur_node.endswith("Z"): - if inst[cur_step % i_len] == "L": - cur_node = nodes[cur_node][0] - else: - cur_node = nodes[cur_node][1] - - cur_step += 1 - z_steps.append(cur_step) - + z_steps = [get_steps_to_z(inst, nodes, x) for x in check_nodes] return math.lcm(*z_steps)