summaryrefslogtreecommitdiff
path: root/18/main.py
diff options
context:
space:
mode:
Diffstat (limited to '18/main.py')
-rwxr-xr-x18/main.py59
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()