-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path14.py
49 lines (32 loc) · 1.12 KB
/
14.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
def reversed_rows(grid):
return [''.join(reversed(row)) for row in grid]
def cols(grid):
return [''.join(col) for col in zip(*grid)]
def reversed_cols(grid):
return [''.join(reversed(col)) for col in cols(grid)]
def move(rows):
return ['#'.join(''.join(sorted(chunk, reverse=True)) for chunk in row.split('#')) for row in rows]
def north_load(grid):
return sum((len(grid) - i) * row.count('O') for i, row in enumerate(grid))
def run_cycle(grid):
grid = cols(move(cols(grid)))
grid = move(grid)
grid = list(reversed(cols(move(reversed_cols(grid)))))
grid = reversed_rows(move(reversed_rows(grid)))
return grid
def hashable(grid):
return '\n'.join(map(''.join, grid))
grid = [list(line.strip()) for line in open('14.txt')]
assert north_load(cols(move(cols(grid)))) == 109833
seen = {}
i = 0
while True:
seen[hashable(grid)] = i
grid = run_cycle(grid)
i += 1
if hashable(grid) in seen:
first = seen[hashable(grid)]
period = i - first
break
target = (1_000_000_000 - first) % period + first
assert north_load(list(seen)[target].splitlines()) == 99875