My Advent of Code solutions in Python. kevinyap.ca/2019/12/going-fast-in-advent-of-code/
advent-of-code python
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add solution for 2023/08

+51
+51
2023/day08.py
··· 1 + import fileinput 2 + from itertools import cycle 3 + from functools import reduce 4 + from utils import parse_line, lcm 5 + 6 + 7 + # Parse input. 8 + elements = {} 9 + for i, line in enumerate(fileinput.input()): 10 + if i == 0: 11 + instructions = line.strip() 12 + elif i >= 2: 13 + node, left, right = parse_line(r'(.+) = \((.+), (.+)\)', line) 14 + elements[node] = (left, right) 15 + 16 + # Solve part 1. 17 + curr = 'AAA' 18 + for i, ins in enumerate(cycle(instructions), start=1): 19 + if ins == 'L': 20 + curr = elements[curr][0] 21 + else: 22 + curr = elements[curr][1] 23 + 24 + if curr == 'ZZZ': 25 + print("Part 1:", i) 26 + break 27 + 28 + # Solve part 2. 29 + starts = [n for n in elements if n.endswith('A')] 30 + cycles = [] 31 + for start in starts: 32 + curr = start 33 + seen = {} 34 + 35 + for i, ins in enumerate(cycle(instructions), start=1): 36 + if ins == 'L': 37 + curr = elements[curr][0] 38 + else: 39 + curr = elements[curr][1] 40 + 41 + if curr.endswith('Z'): 42 + if curr in seen: 43 + cycles.append(i - seen[curr]) 44 + break 45 + 46 + seen[curr] = i 47 + 48 + i += 1 49 + 50 + print("Part 2:", int(reduce(lcm, cycles, 1))) 51 +