From ce1aa028b265c70235dd1f79df24a1ecc2b75583 Mon Sep 17 00:00:00 2001
From: Thomas Voss <thomasvoss@live.com>
Date: Sat, 11 Dec 2021 14:13:15 +0100
Subject: Add day 11 solutions

---
 2021/11/.gitignore |  1 +
 2021/11/Makefile   |  8 +++++++
 2021/11/input      | 10 +++++++++
 2021/11/puzzles.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 85 insertions(+)
 create mode 100644 2021/11/.gitignore
 create mode 100644 2021/11/Makefile
 create mode 100644 2021/11/input
 create mode 100644 2021/11/puzzles.py

(limited to '2021')

diff --git a/2021/11/.gitignore b/2021/11/.gitignore
new file mode 100644
index 0000000..60d075d
--- /dev/null
+++ b/2021/11/.gitignore
@@ -0,0 +1 @@
+puzzle-[12]
diff --git a/2021/11/Makefile b/2021/11/Makefile
new file mode 100644
index 0000000..247194a
--- /dev/null
+++ b/2021/11/Makefile
@@ -0,0 +1,8 @@
+all:
+	sed '/START PART 2/,/END PART 2/d' puzzles.py >puzzle-1.py
+	sed '/START PART 1/,/END PART 1/d' puzzles.py >puzzle-2.py
+	chmod +x puzzle-[12].py
+
+.PHONY: clean
+clean:
+	rm -f puzzle-[12].py
diff --git a/2021/11/input b/2021/11/input
new file mode 100644
index 0000000..c360afa
--- /dev/null
+++ b/2021/11/input
@@ -0,0 +1,10 @@
+1224346384
+5621128587
+6388426546
+1556247756
+1451811573
+1832388122
+2748545647
+2582877432
+3185643871
+2224876627
diff --git a/2021/11/puzzles.py b/2021/11/puzzles.py
new file mode 100644
index 0000000..ad1fa05
--- /dev/null
+++ b/2021/11/puzzles.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python3
+
+# START PART 1
+from itertools import product
+# END PART 1 START PART 2
+from itertools import chain, count, product
+# END PART 2
+
+matrix = list[list[int]]
+rows, cols = -1, -1
+
+
+def flash(grid: matrix, i: int, j: int) -> int:
+	acc = 1
+	grid[i][j] = -1
+
+	for di, dj in ((-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)):
+		ni = i + di
+		nj = j + dj
+		if 0 <= ni < rows and 0 <= nj < cols and grid[ni][nj] != -1:
+			grid[ni][nj] += 1
+			if grid[ni][nj] > 9:
+				acc += flash(grid, ni, nj)
+
+	return acc
+
+
+def main() -> None:
+	global rows, cols
+
+	with open("input", "r", encoding="utf-8") as f:
+		grid = list(map(lambda l: [int(n) for n in l.strip()], f.readlines()))
+
+	rows = len(grid)
+	cols = len(grid[0])
+
+	acc = 0
+	# START PART 1
+	for _ in range(100):
+	# END PART 1 START PART 2
+	for step in count(1):
+	# END PART 2
+		for i, j in product(range(rows), range(cols)):
+			grid[i][j] += 1
+
+		for i, j in product(range(rows), range(cols)):
+			if grid[i][j] > 9:
+				acc += flash(grid, i, j)
+
+		# START PART 2
+		if sum(chain.from_iterable(grid)) == -(rows * cols):
+			print(step)
+			return
+		# END PART 2
+
+		for i, j in product(range(rows), range(cols)):
+			if grid[i][j] == -1:
+				grid[i][j] = 0
+
+	# START PART 1
+	print(acc)
+	# END PART 1
+
+
+if __name__ == "__main__":
+	main()
-- 
cgit v1.2.3