aoc2022/d18.py
2023-12-30 12:10:52 -05:00

72 lines
2.0 KiB
Python

from lib import *
EXAMPLE = """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
"""
def solve(input: Input, second=False):
cubes = set([tuple(map(int, l.split(",")))for l in input.text.splitlines()])
res = len(cubes) * 6
if second:
min_x = min([c[0] for c in cubes]) - 1
max_x = max([c[0] for c in cubes]) + 1
min_y = min([c[1] for c in cubes]) - 1
max_y = max([c[1] for c in cubes]) + 1
min_z = min([c[2] for c in cubes]) - 1
max_z = max([c[2] for c in cubes]) + 1
surrounded = set([(x, y, z)
for x in range(min_x, max_x + 1)
for y in range(min_y, max_y + 1)
for z in range(min_z, max_z + 1)])
surrounded -= cubes
vs = [(min_x, min_y, min_z)]
while vs:
(x, y, z) = vs.pop()
for dx, dy, dz in [(1, 0, 0), (-1, 0, 0), (0, 1, 0), (0, -1, 0), (0, 0, 1), (0, 0, -1)]:
t = x + dx, y + dy, z + dz
if t in surrounded:
surrounded.remove(t)
vs.append(t)
for x, y, z in list(surrounded):
for dx, dy, dz in [(1, 0, 0), (-1, 0, 0), (0, 1, 0), (0, -1, 0), (0, 0, 1), (0, 0, -1)]:
nc = x + dx, y + dy, z + dz
if nc in cubes:
res -= 1
for x, y, z in list(cubes):
for dx, dy, dz in [(1, 0, 0), (-1, 0, 0), (0, 1, 0), (0, -1, 0), (0, 0, 1), (0, 0, -1)]:
nc = x + dx, y + dy, z + dz
if nc in cubes:
res -= 1
return res
def main():
DAY_INPUT = "i18.txt"
print("Example 1:", solve(Input(EXAMPLE)))
print("Solution 1:", solve(Input(DAY_INPUT)))
# 10:30........
print("Example 2:", solve(Input(EXAMPLE), True))
print("Solution 2:", solve(Input(DAY_INPUT), True))
assert solve(Input(DAY_INPUT), True) == 2064
# 30:00
return
if __name__ == "__main__":
main()