summary refs log tree commit diff stats
path: root/day22.py
diff options
context:
space:
mode:
Diffstat (limited to 'day22.py')
-rw-r--r--day22.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/day22.py b/day22.py
new file mode 100644
index 0000000..f2428da
--- /dev/null
+++ b/day22.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+import re
+import numpy as np
+
+coords_regex = re.compile(r'(\-?\d*)\.\.(\-?\d*)')
+with open('day22.txt') as data:
+    instructions = []
+    for line in data:
+        on, coords = line.strip().split()
+        on = (on == 'on')
+        coords = np.array(coords_regex.findall(coords), dtype=int)
+        instructions.append((on, coords))
+
+
+# part 1
+
+reactor = np.zeros((101, 101, 101)).astype(bool)
+for on, coords in instructions:
+    coords = np.copy(coords)
+    coords += 50
+    if np.any(coords > 100) or np.any(coords < 0): break
+    coords[:, 1] += 1
+    coords = tuple(slice(start, stop) for start, stop in coords)
+    reactor[coords] = on
+
+print(np.count_nonzero(reactor))
+
+# part 2
+from collections import Counter
+
+cubes = Counter()
+for on, coords in instructions:
+    nSign = 1 if on else -1
+    nX0, nX1, nY0, nY1, nZ0, nZ1 = coords.flatten()
+
+    update = Counter()
+    for (eX0, eX1, eY0, eY1, eZ0, eZ1), eSign in cubes.items():
+        iX0 = max(nX0, eX0); iX1 = min(nX1, eX1)
+        iY0 = max(nY0, eY0); iY1 = min(nY1, eY1)
+        iZ0 = max(nZ0, eZ0); iZ1 = min(nZ1, eZ1)
+        if iX0 < iX1 and iY0 < iY1 and iZ0 < iZ1:
+            update[(iX0, iX1, iY0, iY1, iZ0, iZ1)] -= eSign
+    
+    if nSign > 0:
+        update[(nX0, nX1, nY0, nY1, nZ0, nZ1)] += nSign
+    cubes.update(update)
+print(sum((x1-x0+1)*(y1-y0+1)*(z1-z0+1)*sgn
+        for (x0, x1, y0, y1, z0, z1), sgn in cubes.items()))