72 lines
2.0 KiB
Python
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()
|