summaryrefslogtreecommitdiff
path: root/2022/day18.py
diff options
context:
space:
mode:
Diffstat (limited to '2022/day18.py')
-rwxr-xr-x2022/day18.py70
1 files changed, 70 insertions, 0 deletions
diff --git a/2022/day18.py b/2022/day18.py
new file mode 100755
index 0000000..92b0583
--- /dev/null
+++ b/2022/day18.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python3
+
+# import numpy as np
+from functools import reduce
+from re import findall
+from copy import deepcopy
+import sys
+
+# filename = "in/day18.ref"
+filename = "in/day18.pzl"
+data = open(filename).read()
+lines = [line for line in data.rstrip('\n').split('\n')]
+# print(lines)
+
+D = dict()
+
+for line in lines:
+ x,y,z = [int(i) for i in line.split(',')]
+ D[(x,y,z)] = 1
+# print(D)
+
+side_len = 0
+for x,y,z in D.keys():
+ side_len = max(side_len, x, y, z)
+side_len += 1
+# print(side_len)
+
+res1 = 0
+for x,y,z in D.keys():
+ for dx,dy,dz in [(1,0,0), (-1,0,0), (0,1,0), (0,-1,0), (0,0,1), (0,0,-1)]:
+ if (x+dx,y+dy,z+dz) not in D:
+ res1 += 1
+
+
+def bfs(visited):
+ while True:
+ start_len = len(visited)
+ new_visited = set()
+ for x,y,z in visited:
+ for dx,dy,dz in [(1,0,0), (-1,0,0), (0,1,0), (0,-1,0), (0,0,1), (0,0,-1)]:
+ if ((x+dx,y+dy,z+dz) not in visited) and \
+ -1 <= x+dx < side_len+1 and \
+ -1 <= y+dy < side_len+1 and \
+ -1 <= z+dz < side_len+1 and \
+ ((x+dx,y+dy,z+dz) not in D):
+ new_visited.add((x+dx,y+dy,z+dz))
+
+ visited = visited.union(new_visited)
+ if len(visited) == start_len:
+ return visited
+
+# O(n**3)
+E = set()
+for x in range(-1, side_len+1):
+ for y in range(-1, side_len+1):
+ for z in range(-1, side_len+1):
+ if max(x,y,z) == side_len or min(x,y,z) == -1:
+ E.add((x,y,z))
+E = bfs(E)
+# print(E)
+
+res2 = 0
+for x,y,z in D.keys():
+ for dx,dy,dz in [(1,0,0), (-1,0,0), (0,1,0), (0,-1,0), (0,0,1), (0,0,-1)]:
+ if (x+dx,y+dy,z+dz) in E:
+ res2 += 1
+
+print('res1:', res1)
+print('res2:', res2)
+