diff options
Diffstat (limited to '18/main.py')
-rwxr-xr-x | 18/main.py | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/18/main.py b/18/main.py new file mode 100755 index 0000000..e6bdf65 --- /dev/null +++ b/18/main.py @@ -0,0 +1,59 @@ +#!/usr/bin/python + +import numpy as np + + + +def init_grid(lines): + dim = len(lines[0]) + grid = np.zeros((dim + 2, dim + 2), dtype="bool") + + for r, line in enumerate(lines): + for c, char in enumerate(line): + if char == "#": + grid[r + 1, c + 1] = True + + return grid + + + +def solve_partn(partn, init, steps): + grid = init_grid(init) + + # Part 2: some lights are stuck in the "on" state + if partn == 2: + grid[([1, 1, -2, -2], [1, -2, 1, -2])] = True + + for i in range(steps): + new_grid = grid.copy() + for x in range(1, grid.shape[0] - 1): + for y in range(1, grid.shape[1] - 1): + neigh = np.sum(grid[x - 1 : x + 2, y - 1 : y + 2]) - grid[x, y] + if grid[x, y]: + if neigh < 2 or neigh > 3: + new_grid[x, y] = False + else: # not grid[x, y] + if neigh == 3: + new_grid[x, y] = True + + if partn == 2: + new_grid[([1, 1, -2, -2], [1, -2, 1, -2])] = True + + grid = new_grid + + return np.count_nonzero(grid) + + + +def main(): + # Read initial state from input text file + with open("input.txt", "r") as f: + lines = f.read().splitlines() + + print("Part 1 solution:", solve_partn(1, lines, 100)) # 821 for me + print("Part 2 solution:", solve_partn(2, lines, 100)) # 886 for me + + + +if __name__ == "__main__": + main() |