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
|
import numpy as np
with open('day21.txt') as f:
instructions = f.readlines()
mappings = {}
start = '.#./..#/###'
def translate_to_np(s):
return np.array([[c == '#' for c in l]
for l in s.split('/')])
for line in instructions:
k, v = map(translate_to_np, line.strip().split(' => '))
for a in (k, np.fliplr(k)):
for r in range(4):
mappings[np.rot90(a, r).tobytes()] = v
def enhance(grid):
size = len(grid)
by = 2 if size % 2 == 0 else 3
resize = lambda x: x * (by+1) // by
new_size = resize(size)
solution = np.empty((new_size, new_size), dtype=bool)
squares = range(0, size, by)
new_squares = range(0, new_size, by+1)
for i, ni in zip(squares, new_squares):
for j, nj in zip(squares, new_squares):
square = grid[i:i+by, j:j+by]
enhanced = mappings[square.tobytes()]
solution[ni:ni+by+1, nj:nj+by+1] = enhanced
return solution
def solve(part):
grid = translate_to_np(start)
iterations = 5 if part == 1 else 18
for _ in range(iterations):
grid = enhance(grid)
return int(grid.sum())
print(solve(part=1))
print(solve(part=2))
|