In [60]:
import numpy as np
def parse_grid(input_path, size):
grid = []
with open(input_path, 'rt') as f_input:
for line in f_input:
grid += list(line.rstrip())
grid = np.array(grid)
return grid.reshape(size, size)
In [61]:
from itertools import product
def adjacent(a, b, size):
for i, j in product([-1, 0, 1], repeat=2):
if (0 <= a + i < size) and (0 <= b + j < size):
if (i != 0) or (j != 0):
yield a + i, b + j
def transform(grid, size):
new_grid = np.empty((size, size), dtype=object)
for i, j in product(range(size), repeat=2):
on = sum([1 if grid[a, b] == '#' else 0 for a, b in adjacent(i, j, size)])
if grid[i, j] == '#':
if on in [2, 3]:
new_grid[i, j] = '#'
else:
new_grid[i, j] = '.'
elif grid[i, j] == '.':
if on == 3:
new_grid[i, j] = '#'
else:
new_grid[i, j] = '.'
return new_grid
In [66]:
def iterate_grid(initial_state, size, n):
s = initial_state
for _ in range(n):
s = transform(s, size)
return s
def lights_on(initial_state, size, n):
s = iterate_grid(initial_state, size, n)
count = 0
for i, j in product(range(size), repeat=2):
if s[i, j] == '#':
count += 1
return count
In [67]:
test_grid = parse_grid('inputs/input17.test1.txt', 6)
In [68]:
print(test_grid)
In [69]:
print(transform(test_grid, 6))
In [70]:
print(iterate_grid(test_grid, 6, 4))
In [71]:
assert(lights_on(test_grid, 6, 4) == 4)
In [73]:
grid = parse_grid('inputs/input17.txt', 100)
lights_on(grid, 100, 100)
Out[73]:
In [74]:
def force_lights_stuck(grid, size):
grid[0, 0] = '#'
grid[0, size - 1] = '#'
grid[size - 1, 0] = '#'
grid[size - 1, size - 1] = '#'
return grid
In [76]:
def iterate_grid_stuck(initial_state, size, n):
s = initial_state
s = force_lights_stuck(s, size)
for _ in range(n):
s = transform(s, size)
s = force_lights_stuck(s, size)
return s
def lights_on_stuck(initial_state, size, n):
s = iterate_grid_stuck(initial_state, size, n)
count = 0
for i, j in product(range(size), repeat=2):
if s[i, j] == '#':
count += 1
return count
In [77]:
test_grid = parse_grid('inputs/input17.test1.txt', 6)
lights_on_stuck(test_grid, 6, 5)
Out[77]:
In [78]:
grid = parse_grid('inputs/input17.txt', 100)
lights_on_stuck(grid, 100, 100)
Out[78]:
In [ ]: