-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday6.py
81 lines (68 loc) · 1.91 KB
/
day6.py
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
74
75
76
77
78
79
80
81
def part1(src):
g = set()
p = None
w, h = 0, 0
for y, r in enumerate(src.splitlines()):
for x, c in enumerate(r):
if c == "#":
g.add((x,y))
elif c == "^":
p = x,y
w = max(x, w)
h = max(y, h)
w += 1
h += 1
nd = {(1,0): (0, 1), (0, 1): (-1, 0), (-1, 0): (0, -1), (0, -1): (1, 0)}
dx, dy = 0, -1
x, y = p
s = set()
while 0 <= x < w and 0 <= y < h:
s.add((x, y))
if (x + dx, y + dy) in g:
dx, dy = nd[(dx, dy)]
x += dx
y += dy
return len(s)
def part2(src):
g = set()
p = None
w, h = 0, 0
for y, r in enumerate(src.splitlines()):
for x, c in enumerate(r):
if c == "#":
g.add((x,y))
elif c == "^":
p = x,y
w = max(x, w)
h = max(y, h)
w += 1
h += 1
nd = {(1,0): (0, 1), (0, 1): (-1, 0), (-1, 0): (0, -1), (0, -1): (1, 0)}
dx, dy = 0, -1
x, y = p
c = set()
from collections import defaultdict
vv = set()
while 0 <= x < w and 0 <= y < h:
if (x + dx, y + dy) in g:
dx, dy = nd[dx, dy]
else:
vv.add((x,y))
x += dx
y += dy
if (x+dx, y+dy) not in vv and 0 <= (x + dx) < w and 0 <= (y + dy) < h:
v = defaultdict(set)
v[x,y].add((dx, dy))
xt, yt = nd[dx, dy]
xp, yp = x, y
while 0 <= xp < w and 0 <= yp < h:
v[xp, yp].add((xt, yt))
if (xp + xt, yp + yt) in g or (xp + xt, yp + yt) == (x+dx, y+dy):
xt, yt = nd[xt, yt]
else:
xp += xt
yp += yt
if (xt, yt) in v[xp, yp]:
c.add((x + dx, y + dy))
break
return len(c)