aboutsummaryrefslogtreecommitdiff
path: root/2023/23/solve.py
blob: 185328e58b4b6c95f8112b706b355d4f1ba352cd (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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import sys

sys.setrecursionlimit(100000)

L = {
    (y, x): c
    for y, l in enumerate(open("input").readlines())
    for x, c in enumerate(l.strip())
    if c != "#"
}


def oob(y, x, d):
    return (y, x) not in L


def next(y, x, d):
    if d == 0:
        return (y - 1, x, d)
    if d == 1:
        return (y, x + 1, d)
    if d == 2:
        return (y + 1, x, d)
    if d == 3:
        return (y, x - 1, d)


def neighbours(y, x, d):
    ch = L[(y, x)]

    if ch == "^":
        return [next(y, x, 0)]
    if ch == ">":
        return [next(y, x, 1)]
    if ch == "v":
        return [next(y, x, 2)]
    if ch == "<":
        return [next(y, x, 3)]

    return [next(y, x, 0), next(y, x, 1), next(y, x, 2), next(y, x, 3)]


def dfs(y, x, d, v, p):
    v.add((y, x))

    ps = []
    ns = neighbours(y, x, d)
    for n in ns:
        if (n[0], n[1]) not in v and not oob(*n):
            np = p + [n]
            ps.append(tuple(np))
            ps.extend(dfs(*n, set(v), np))

    return ps


def solve1():
    ps = dfs(0, 1, 2, set(), [(0, 1)])
    mx = max(len(p) for p in ps)
    print(mx - 1)


# def solve2():
#     res = 0
#     for x in range(W):
#         res = max(res, visited(0, x, 2), visited(H, x, 0))
#     for y in range(H):
#         res = max(res, visited(y, 0, 1), visited(y, W, 3))
#     print(res)


solve1()
# solve2()