-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
96 lines (79 loc) · 2.49 KB
/
Copy pathmain.py
File metadata and controls
96 lines (79 loc) · 2.49 KB
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
D = [i.strip() for i in open("input", "r").readlines()]
g = list("".join(D))
w = len(D[0])
h = len(D)
def roll_north(g, w, h):
new_grid = g[:]
for j in range(h):
for i in range(w):
if g[w * j + i] == "O":
jj = j
while jj > 0 and not (
new_grid[(jj - 1) * w + i] == "O"
or new_grid[(jj - 1) * w + i] == "#"
):
jj -= 1
new_grid[j * w + i] = "."
new_grid[jj * w + i] = "O"
return new_grid
def roll_west(g, w, h):
new_grid = g[:]
for i in range(w):
for j in range(h):
if g[w * j + i] == "O":
ii = i
while ii > 0 and not (
new_grid[j * w + (ii - 1)] == "O"
or new_grid[j * w + (ii - 1)] == "#"
):
ii -= 1
new_grid[j * w + i] = "."
new_grid[j * w + ii] = "O"
return new_grid
def roll_south(g, w, h):
new_grid = g[:]
for j in range(h - 1, -1, -1):
for i in range(w):
if g[w * j + i] == "O":
jj = j
while jj < (h - 1) and not (
new_grid[(jj + 1) * w + i] == "O"
or new_grid[(jj + 1) * w + i] == "#"
):
jj += 1
new_grid[j * w + i] = "."
new_grid[jj * w + i] = "O"
return new_grid
def roll_east(g, w, h):
new_grid = g[:]
for i in range(w - 1, -1, -1):
for j in range(h):
if g[w * j + i] == "O":
ii = i
while ii < (w - 1) and not (
new_grid[j * w + (ii + 1)] == "O"
or new_grid[j * w + (ii + 1)] == "#"
):
ii += 1
new_grid[j * w + i] = "."
new_grid[j * w + ii] = "O"
return new_grid
def score(g, w, h):
return sum((h - j) for i in range(w) for j in range(h) if g[j * w + i] == "O")
p1 = score(roll_north(g, w, h), w, h)
seen, reverse_seen = {}, {}
start, mod = None, None
for i in range(1000000000):
g = roll_north(g, w, h)
g = roll_west(g, w, h)
g = roll_south(g, w, h)
g = roll_east(g, w, h)
fs = "".join(g)
if fs in seen:
start = seen[fs]
mod = i - start
break
seen[fs] = i
reverse_seen[i] = g
g = reverse_seen[start + ((1000000000 - start) % mod) - 1]
print("day14", p1, score(g, w, h))