thiagowfx's avatar

Β¬ just serendipity πŸ€ (not just serendipity)

AoC 2025 Day 1: Secret Entrance

β€’ 294 words β€’ 2 min β€’ updated

A new year, a new advent of code. My Pythonista self is always happy.

AoC 2025 Day 1: Secret Entrance:

Part One #

python
#!/usr/bin/env python3
import sys

def main():
    with open(sys.argv[1]) as input:
        lines = input.read().splitlines()

    ans = 0
    dial = 50

    for line in lines:
        direction = line[0]
        assert direction in 'LR'

        delta = int(line[1:])
        assert delta >= 0

        dial = (dial + (-1 if direction == 'L' else 1) * delta + 100) % 100
        # print(direction, delta, dial)

        if dial == 0:
            ans += 1

    print(ans)


if __name__ == '__main__':
    main()

Straightforward. Just need to % once.

Part Two #

python
#!/usr/bin/env python3
import sys

def part1(lines):
    ans = 0
    dial = 50

    for line in lines:
        direction = line[0]
        assert direction in 'LR'

        delta = int(line[1:])
        assert delta > 0

        dial = (dial + (-1 if direction == 'L' else 1) * delta + 100) % 100
        # print(direction, delta, dial)

        if dial == 0:
            ans += 1

    print(ans)


def part2(lines):
    ans = 0
    dial = 50

    print(dial)

    for line in lines:
        direction = line[0]
        assert direction in 'LR'

        delta = int(line[1:])
        assert delta > 0

        was_zero = dial == 0
        dial = dial + (-1 if direction == 'L' else 1) * delta

        passes = 0

        if dial > 0:
            passes = dial // 100
            dial %= 100
        elif dial < 0:
            passes = abs((dial - 1) // 100)
            dial %= 100
            assert dial >= 0
            passes -= int(was_zero)
        else:
            passes = 1

        # print(direction, delta, dial)
        # print(f'{passes=}')

        ans += passes

    print(ans)


def main():
    with open(sys.argv[1]) as input:
        lines = input.read().splitlines()

    part1(lines)
    part2(lines)


if __name__ == '__main__':
    main()

Various edge cases.

Positive dials are easy.

Non-positive dials require accounting for whether the dial was initially in zero.