62 lines
1.7 KiB
Python
62 lines
1.7 KiB
Python
from lib import *
|
|
|
|
input = read_input(2022, 18)
|
|
|
|
|
|
cubes = [(x, y, z) for x, y, z in map(ints, input.splitlines())]
|
|
|
|
|
|
out = 0
|
|
for i, x in enumerate(cubes):
|
|
out += 6
|
|
for y in cubes[:i]:
|
|
if abs(x[0] - y[0]) + abs(x[1] - y[1]) + abs(x[2] - y[2]) == 1:
|
|
out -= 2
|
|
print(out)
|
|
|
|
|
|
out = 0
|
|
(minx, miny, minz) = (maxx, maxy, maxz) = cubes[0]
|
|
for i, x in enumerate(cubes):
|
|
out += 6
|
|
for y in cubes[:i]:
|
|
if abs(x[0] - y[0]) + abs(x[1] - y[1]) + abs(x[2] - y[2]) == 1:
|
|
out -= 2
|
|
minx = min(x[0], minx)
|
|
miny = min(x[1], miny)
|
|
minz = min(x[2], minz)
|
|
maxx = max(x[0], maxx)
|
|
maxy = max(x[1], maxy)
|
|
maxz = max(x[2], maxz)
|
|
|
|
checked = set()
|
|
candidates = [
|
|
(i, j, k)
|
|
for x, y, z in cubes
|
|
for i, j, k in [(x, y, z - 1), (x, y, z + 1), (x, y - 1, z), (x, y + 1, z), (x - 1, y, z), (x + 1, y, z)]
|
|
if (i, j, k) not in cubes
|
|
]
|
|
while candidates:
|
|
queue = [candidates.pop()]
|
|
if queue[0] in checked:
|
|
continue
|
|
visited = set()
|
|
while queue:
|
|
x, y, z = queue.pop(0)
|
|
if x not in range(minx, maxx + 1) or y not in range(miny, maxy + 1) or z not in range(minz, maxz + 1):
|
|
break
|
|
if (x, y, z) in visited:
|
|
continue
|
|
visited.add((x, y, z))
|
|
for q in [(x, y, z - 1), (x, y, z + 1), (x, y - 1, z), (x, y + 1, z), (x - 1, y, z), (x + 1, y, z)]:
|
|
if q not in cubes and q not in visited:
|
|
queue.append(q)
|
|
else:
|
|
for x, y, z in visited:
|
|
for q in [(x, y, z - 1), (x, y, z + 1), (x, y - 1, z), (x, y + 1, z), (x - 1, y, z), (x + 1, y, z)]:
|
|
if q in cubes:
|
|
out -= 1
|
|
|
|
checked.update(visited)
|
|
|
|
print(out)
|