Day 18: Like a GIF For Your Yard

Day 18.1


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

Test


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)

Solution


In [73]:
grid = parse_grid('inputs/input17.txt', 100)
lights_on(grid, 100, 100)


Out[73]:
821

Day 18.2


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

Test


In [77]:
test_grid = parse_grid('inputs/input17.test1.txt', 6)
lights_on_stuck(test_grid, 6, 5)


Out[77]:
17

Solution


In [78]:
grid = parse_grid('inputs/input17.txt', 100)
lights_on_stuck(grid, 100, 100)


Out[78]:
886

In [ ]: