DEV Community

Cover image for Advent of Code 2023 - December 8th
Rob van der Leek
Rob van der Leek

Posted on

Advent of Code 2023 - December 8th

In this series, I'll share my progress with the 2023 version of Advent of Code.

Check the first post for a short intro to this series.

You can also follow my progress on GitHub.

December 8th

The puzzle of day 8 was not so hard. I like graph problems, although this was pretty basic.

My pitfall for this puzzle: I have no clue how to find the number that's a common factor for all path lengths. Something similar to Greatest Common Divisor, but what 🤷. In the end a brute force approach worked and doesn't take that long on my M1 laptop.

Solution here, do not click if you want to solve the puzzle first yourself
#!/usr/bin/env python3
import math

with open('input.txt') as infile:
    lines = infile.readlines()
directions = [d for d in lines[0].strip()]

graph = {}
for line in lines[2:]:
    parts = line.strip().split(' = ')
    targets = parts[1][1:-1].split(', ')
    graph[parts[0]] = {'L': targets[0], 'R': targets[1]}

dir_idx = 0
steps = 0
nodes = [n for n in graph.keys() if n.endswith('A')]
finished = []
while len([n for n in nodes if not n.endswith('Z')]) > 0:
    steps += 1
    for idx, n in enumerate(nodes):
        if idx in [f[0] for f in finished]:
            continue
        nodes[idx] = graph[n][directions[dir_idx]]
        if nodes[idx].endswith('Z'):
            finished.append((idx, steps))
    if dir_idx < len(directions) - 1:
        dir_idx += 1
    else:
        dir_idx = 0
for f in finished:
    print(f'Finished node {f[0]} in {f[1]} steps')

highest = max([f[1] for f in finished])
total = highest
while True:
    all_divisors = True
    for f in finished:
        if total % f[1] != 0:
            all_divisors = False
    if all_divisors:
        break
    else:
        total += highest
print(total)
Enter fullscreen mode Exit fullscreen mode

That's it! See you again tomorrow!

Top comments (0)