Day 22
This commit is contained in:
parent
9159c4cc72
commit
3bfb101052
59
2021/day22.py
Normal file
59
2021/day22.py
Normal file
|
@ -0,0 +1,59 @@
|
|||
with open("input22.txt") as f:
|
||||
lines = [line.rstrip() for line in f]
|
||||
steps = []
|
||||
for line in lines:
|
||||
toggle, coords = line.split()
|
||||
xr, yr, zr = (
|
||||
tuple(map(int, coord[2:].split("..")))
|
||||
for coord in coords.split(",")
|
||||
)
|
||||
steps.append((toggle == "on", (xr, yr, zr)))
|
||||
|
||||
|
||||
def print_volume(cuboids):
|
||||
num_on = sum(
|
||||
(x2 - x1 + 1) * (y2 - y1 + 1) * (z2 - z1 + 1)
|
||||
for (x1, x2), (y1, y2), (z1, z2) in cuboids
|
||||
)
|
||||
print(num_on)
|
||||
|
||||
|
||||
cuboids = []
|
||||
for index, (toggle, step_cuboid) in enumerate(steps):
|
||||
next_cuboids = []
|
||||
(sx1, sx2), (sy1, sy2), (sz1, sz2) = step_cuboid
|
||||
for cuboid in cuboids:
|
||||
# If this cuboid does not intersect with our step, skip it.
|
||||
if not all(
|
||||
not (a1 > b2 or b1 > a2)
|
||||
for (a1, a2), (b1, b2) in zip(cuboid, step_cuboid)
|
||||
):
|
||||
next_cuboids.append(cuboid)
|
||||
continue
|
||||
(cx1, cx2), (cy1, cy2), (cz1, cz2) = cuboid
|
||||
# Create a new sliced cube for each intersecting plane.
|
||||
# Probably cleaner to do proper cuboid intersection but pffffff
|
||||
if cx1 <= sx2 <= cx2:
|
||||
next_cuboids.append(((sx2 + 1, cx2), (cy1, cy2), (cz1, cz2)))
|
||||
cx2 = sx2
|
||||
if cx1 <= sx1 <= cx2:
|
||||
next_cuboids.append(((cx1, sx1 - 1), (cy1, cy2), (cz1, cz2)))
|
||||
cx1 = sx1
|
||||
if cy1 <= sy2 <= cy2:
|
||||
next_cuboids.append(((cx1, cx2), (sy2 + 1, cy2), (cz1, cz2)))
|
||||
cy2 = sy2
|
||||
if cy1 <= sy1 <= cy2:
|
||||
next_cuboids.append(((cx1, cx2), (cy1, sy1 - 1), (cz1, cz2)))
|
||||
cy1 = sy1
|
||||
if cz1 <= sz2 <= cz2:
|
||||
next_cuboids.append(((cx1, cx2), (cy1, cy2), (sz2 + 1, cz2)))
|
||||
cz2 = sz2
|
||||
if cz1 <= sz1 <= cz2:
|
||||
next_cuboids.append(((cx1, cx2), (cy1, cy2), (cz1, sz1 - 1)))
|
||||
cz1 = sz1
|
||||
if toggle:
|
||||
next_cuboids.append(step_cuboid)
|
||||
cuboids = next_cuboids
|
||||
if index == 19:
|
||||
print_volume(cuboids)
|
||||
print_volume(cuboids)
|
Loading…
Reference in a new issue