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()
|