Files
python-aoc-2020/day24/part2.py
Sebastian Seedorf 8cc845167e Day 24
2020-12-30 16:40:28 +01:00

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))