aboutsummaryrefslogtreecommitdiff
path: root/2024/06/solve.py
blob: 9239aa92ee1db334566dc55c2bed1fc9e7da2f27 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/bin/env python


L = [l.strip() for l in open("input").readlines()]

UP = 0
RIGHT = 1
DOWN = 2
LEFT = 3

YLEN = len(L)
XLEN = len(L[0])


def start():
    for y, row in enumerate(L):
        for x, col in enumerate(row):
            if col == "^":
                L[y] = "".join(map(lambda c: "." if c == "^" else c, L[y]))
                return (y, x, UP)


def get(y, x):
    if 0 <= y < YLEN and 0 <= x < XLEN:
        return L[y][x]
    return "#"


def move(y, x, d):
    if d == UP and get(y - 1, x) == ".":
        return (y - 1, x, UP)
    if d == RIGHT and get(y, x + 1) == ".":
        return (y, x + 1, RIGHT)
    if d == DOWN and get(y + 1, x) == ".":
        return (y + 1, x, DOWN)
    if d == LEFT and get(y, x - 1) == ".":
        return (y, x - 1, LEFT)

    # else: rotate right
    return (y, x, (d + 1) % 4)


def part1():
    visits = set()
    y, x, d = start()
    visits.add((y, x))
    while not (
        (d == UP and y == 0)
        or (d == RIGHT and x == XLEN - 1)
        or (d == DOWN and y == YLEN - 1)
        or (d == LEFT and x == 0)
    ):
        y, x, d = move(y, x, d)
        visits.add((y, x))

    print(len(visits))


part1()