day18, 16/17 are for lonely nights

master
Tom Weber 2 years ago
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…
Cancel
Save