parent
2f0556d7a5
commit
0e483e824f
@ -0,0 +1,13 @@
|
|||||||
|
2,2,2
|
||||||
|
1,2,2
|
||||||
|
3,2,2
|
||||||
|
2,1,2
|
||||||
|
2,3,2
|
||||||
|
2,2,1
|
||||||
|
2,2,3
|
||||||
|
2,2,4
|
||||||
|
2,2,6
|
||||||
|
1,2,5
|
||||||
|
3,2,5
|
||||||
|
2,1,5
|
||||||
|
2,3,5
|
@ -0,0 +1,22 @@
|
|||||||
|
lines = open("input.txt", "r").read().splitlines()
|
||||||
|
drops = set()
|
||||||
|
for line in lines:
|
||||||
|
drop = line.split(",")
|
||||||
|
drop = (int(drop[0]), int(drop[1]), int(drop[2]))
|
||||||
|
drops.add(drop)
|
||||||
|
|
||||||
|
|
||||||
|
def check_adjacent(drop, drops):
|
||||||
|
pos = ((0, 0, 1), (0, 1, 0), (1, 0, 0), (0, 0, -1), (0, -1, 0), (-1, 0, 0))
|
||||||
|
sides = 6
|
||||||
|
for p in pos:
|
||||||
|
if (drop[0] + p[0], drop[1] + p[1], drop[2] + p[2]) in drops:
|
||||||
|
sides -= 1
|
||||||
|
return sides
|
||||||
|
|
||||||
|
|
||||||
|
s = 0
|
||||||
|
for drop in drops:
|
||||||
|
s += check_adjacent(drop, drops)
|
||||||
|
|
||||||
|
print(s)
|
@ -0,0 +1,86 @@
|
|||||||
|
import itertools
|
||||||
|
|
||||||
|
lines = open("input.txt", "r").read().splitlines()
|
||||||
|
drops = set()
|
||||||
|
for line in lines:
|
||||||
|
drop = line.split(",")
|
||||||
|
drop = (int(drop[0]), int(drop[1]), int(drop[2]))
|
||||||
|
drops.add(drop)
|
||||||
|
|
||||||
|
|
||||||
|
def check_adjacent(drop, drops):
|
||||||
|
pos = ((0, 0, 1), (0, 1, 0), (1, 0, 0), (0, 0, -1), (0, -1, 0), (-1, 0, 0))
|
||||||
|
sides = 6
|
||||||
|
for p in pos:
|
||||||
|
if (drop[0] + p[0], drop[1] + p[1], drop[2] + p[2]) in drops:
|
||||||
|
sides -= 1
|
||||||
|
return sides
|
||||||
|
|
||||||
|
|
||||||
|
def get_dims(drops):
|
||||||
|
maxx, maxy, maxz = -1, -1, -1
|
||||||
|
minx, miny, minz = 9999, 9999, 9999
|
||||||
|
for drop in drops:
|
||||||
|
if drop[0] > maxx:
|
||||||
|
maxx = drop[0]
|
||||||
|
if drop[0] < minx:
|
||||||
|
minx = drop[0]
|
||||||
|
if drop[1] > maxy:
|
||||||
|
maxy = drop[1]
|
||||||
|
if drop[1] < miny:
|
||||||
|
miny = drop[1]
|
||||||
|
if drop[2] > maxz:
|
||||||
|
maxz = drop[2]
|
||||||
|
if drop[2] < minz:
|
||||||
|
minz = drop[2]
|
||||||
|
return maxx, maxy, maxz, minx, miny, minz
|
||||||
|
|
||||||
|
|
||||||
|
def generate_full_cube(drops):
|
||||||
|
dims = get_dims(drops)
|
||||||
|
maxdims = [x + 2 for x in dims[:3]]
|
||||||
|
mindims = [x - 2 for x in dims[3:]]
|
||||||
|
ranges = [range(x, y + 1) for x, y in zip(mindims, maxdims)]
|
||||||
|
return set(itertools.product(*ranges))
|
||||||
|
|
||||||
|
|
||||||
|
def steam(drops):
|
||||||
|
dims = get_dims(drops)
|
||||||
|
maxdims = [x + 2 for x in dims[:3]]
|
||||||
|
mindims = [x - 2 for x in dims[3:]]
|
||||||
|
start = tuple((x - 1 for x in maxdims))
|
||||||
|
visited = set()
|
||||||
|
rim = set()
|
||||||
|
pos = ((0, 0, 1), (0, 1, 0), (1, 0, 0), (0, 0, -1), (0, -1, 0), (-1, 0, 0))
|
||||||
|
free = {start}
|
||||||
|
while len(free) > 0:
|
||||||
|
current = free.pop()
|
||||||
|
visited.add(current)
|
||||||
|
for p in pos:
|
||||||
|
n = (current[0] + p[0], current[1] + p[1], current[2] + p[2])
|
||||||
|
if n in drops:
|
||||||
|
rim.add(n)
|
||||||
|
elif (
|
||||||
|
maxdims[0] >= n[0] >= mindims[0]
|
||||||
|
and maxdims[1] >= n[1] >= mindims[1]
|
||||||
|
and maxdims[2] >= n[2] >= mindims[2]
|
||||||
|
and n not in visited
|
||||||
|
):
|
||||||
|
free.add(n)
|
||||||
|
return visited
|
||||||
|
|
||||||
|
|
||||||
|
steam = steam(drops)
|
||||||
|
|
||||||
|
cube = generate_full_cube(drops)
|
||||||
|
|
||||||
|
air = cube.symmetric_difference(steam.union(drops))
|
||||||
|
|
||||||
|
b = 0
|
||||||
|
for c in air:
|
||||||
|
b += 6 - (check_adjacent(c, drops))
|
||||||
|
s = 0
|
||||||
|
for d in drops:
|
||||||
|
s += check_adjacent(d, drops)
|
||||||
|
|
||||||
|
print(s - b)
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue