Sean McLemon | Advent of Code

Home | Czech | Blog | GitHub | Advent Of Code | Notes


2015-12-18 = Like a GIF For Your Yard

(original .ipynb)

Puzzle input is a grid of lights, composed of '#' (meaning "on") and '.' (meaning "off"). Part one involves applying a set of Game Of life type instructions and counting how many lights are "on" after 100 time steps. Part two involves doing the same but forcing the corner lights to always be on.

from advent import neighbours8

puzzle_input_str = open("./puzzle_input/day18.txt").read()

test_input_str = """.#.#.#
...##.
#....#
..#...
#.#..#
####.."""


def next_state(grid, r, c):
    light = grid[r][c]
    on_neighbours = len([grid[nr][nc] for nr,nc in neighbours8(grid, r, c) if grid[nr][nc]])
    if light and (on_neighbours == 2 or on_neighbours == 3):
        return True
    elif (not light) and on_neighbours == 3:
        return True
    return False


def step_grid(grid):
    next_grid = []
    for r, row in enumerate(grid):
        next_row = []
        for c, col in enumerate(row):
            next_row.append(next_state(grid, r, c))
        next_grid.append(next_row)
    return next_grid


def nop(grid):
    pass
    
    
def part_one(input_str, steps=100, postprocess=nop):
    grid = [
        [True if c == "#" else False for c in line]
        for line in input_str.split("\n")
    ]
    postprocess(grid)
    
    for _ in range(steps):
        grid = step_grid(grid)        
        postprocess(grid)

    return sum(
        sum(1 for col in row if col)
        for row in grid
    )


assert 4 == part_one(test_input_str, 4)

print("part one:", part_one(puzzle_input_str))
part one: 768
def turn_corners_on(grid):
    last_row = len(grid) - 1
    last_col = len(grid[0]) - 1
    grid[0][0]               = True
    grid[0][last_col]        = True
    grid[last_row][0]        = True
    grid[last_row][last_col] = True


def part_two(input_str, steps=100):
    return part_one(input_str, steps, turn_corners_on)


assert 17 == part_two(test_input_str, 5)

print("part two:", part_two(puzzle_input_str))
part two: 781