52 lines
1.3 KiB
Python
52 lines
1.3 KiB
Python
#!/usr/bin/env python3
|
|
import numpy as np
|
|
from scipy.signal import convolve
|
|
|
|
lines = (x.strip() for x in open("input.txt"))
|
|
|
|
blacks = set()
|
|
|
|
for line in lines:
|
|
x, y = 0, 0
|
|
while len(line):
|
|
if line[0] == "n":
|
|
y += 1
|
|
x += 1 if line[1] == "e" else 0
|
|
line = line[2:]
|
|
elif line[0] == "s":
|
|
y -= 1
|
|
x -= 1 if line[1] == "w" else 0
|
|
line = line[2:]
|
|
else:
|
|
x += 1 if line[0] == "e" else -1
|
|
line = line[1:]
|
|
if (x, y) in blacks:
|
|
blacks.discard((x, y))
|
|
else:
|
|
blacks.add((x, y))
|
|
|
|
|
|
x = np.array(list([x, y] for x, y in blacks)).T
|
|
lower = np.min(x, axis=1)
|
|
upper = np.max(x, axis=1)
|
|
grid = np.zeros((upper[0]-lower[0]+1, upper[1]-lower[1]+1))
|
|
x -= np.array([lower]).T
|
|
grid[x[0], x[1]] = 1
|
|
kernel = np.array([
|
|
[1, 1, 0],
|
|
[1, 0, 1],
|
|
[0, 1, 1]
|
|
])
|
|
|
|
for _ in range(100):
|
|
grid = np.pad(grid, pad_width=1)
|
|
neighbors = convolve(grid, kernel, mode='same', method="direct")
|
|
set_inactive = np.logical_and(grid == 1, np.logical_or(neighbors == 0, neighbors > 2))
|
|
set_active = np.logical_and(grid == 0, neighbors == 2)
|
|
grid[set_inactive] = 0
|
|
grid[set_active] = 1
|
|
a = tuple(slice(np.min(idxs), np.max(idxs)+1) for idxs in np.where(grid == 1))
|
|
grid = grid[a]
|
|
|
|
print(np.sum(grid))
|