Solution to problem 17 part 2 in Python
This commit is contained in:
parent
606c111e32
commit
93ea53841c
306
src/2020/P17.py
306
src/2020/P17.py
@ -217,5 +217,311 @@ def part_1() -> None:
|
||||
print(f"After 6 cycles in 3D, we have {len(active_points)} active cubes")
|
||||
|
||||
|
||||
# --- Part Two ---
|
||||
|
||||
# For some reason, your simulated results don't match what the experimental
|
||||
# energy source engineers expected. Apparently, the pocket dimension actually
|
||||
# has four spatial dimensions, not three.
|
||||
|
||||
# The pocket dimension contains an infinite 4-dimensional grid. At every
|
||||
# integer 4-dimensional coordinate (x,y,z,w), there exists a single cube
|
||||
# (really, a hypercube) which is still either active or inactive.
|
||||
|
||||
# Each cube only ever considers its neighbors: any of the 80 other cubes where
|
||||
# any of their coordinates differ by at most 1. For example, given the cube at
|
||||
# x=1,y=2,z=3,w=4, its neighbors include the cube at x=2,y=2,z=3,w=3, the cube
|
||||
# at x=0,y=2,z=3,w=4, and so on.
|
||||
|
||||
# The initial state of the pocket dimension still consists of a small flat
|
||||
# region of cubes. Furthermore, the same rules for cycle updating still apply:
|
||||
# during each cycle, consider the number of active neighbors of each cube.
|
||||
|
||||
# For example, consider the same initial state as in the example above. Even
|
||||
# though the pocket dimension is 4-dimensional, this initial state represents a
|
||||
# small 2-dimensional slice of it. (In particular, this initial state defines a
|
||||
# 3x3x1x1 region of the 4-dimensional space.)
|
||||
|
||||
# Simulating a few cycles from this initial state produces the following
|
||||
# configurations, where the result of each cycle is shown layer-by-layer at
|
||||
# each given z and w coordinate:
|
||||
|
||||
# Before any cycles:
|
||||
|
||||
# z=0, w=0
|
||||
# .#.
|
||||
# ..#
|
||||
# ###
|
||||
|
||||
|
||||
# After 1 cycle:
|
||||
|
||||
# z=-1, w=-1
|
||||
# #..
|
||||
# ..#
|
||||
# .#.
|
||||
|
||||
# z=0, w=-1
|
||||
# #..
|
||||
# ..#
|
||||
# .#.
|
||||
|
||||
# z=1, w=-1
|
||||
# #..
|
||||
# ..#
|
||||
# .#.
|
||||
|
||||
# z=-1, w=0
|
||||
# #..
|
||||
# ..#
|
||||
# .#.
|
||||
|
||||
# z=0, w=0
|
||||
# #.#
|
||||
# .##
|
||||
# .#.
|
||||
|
||||
# z=1, w=0
|
||||
# #..
|
||||
# ..#
|
||||
# .#.
|
||||
|
||||
# z=-1, w=1
|
||||
# #..
|
||||
# ..#
|
||||
# .#.
|
||||
|
||||
# z=0, w=1
|
||||
# #..
|
||||
# ..#
|
||||
# .#.
|
||||
|
||||
# z=1, w=1
|
||||
# #..
|
||||
# ..#
|
||||
# .#.
|
||||
|
||||
|
||||
# After 2 cycles:
|
||||
|
||||
# z=-2, w=-2
|
||||
# .....
|
||||
# .....
|
||||
# ..#..
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=-1, w=-2
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=0, w=-2
|
||||
# ###..
|
||||
# ##.##
|
||||
# #...#
|
||||
# .#..#
|
||||
# .###.
|
||||
|
||||
# z=1, w=-2
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=2, w=-2
|
||||
# .....
|
||||
# .....
|
||||
# ..#..
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=-2, w=-1
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=-1, w=-1
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=0, w=-1
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=1, w=-1
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=2, w=-1
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=-2, w=0
|
||||
# ###..
|
||||
# ##.##
|
||||
# #...#
|
||||
# .#..#
|
||||
# .###.
|
||||
|
||||
# z=-1, w=0
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=0, w=0
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=1, w=0
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=2, w=0
|
||||
# ###..
|
||||
# ##.##
|
||||
# #...#
|
||||
# .#..#
|
||||
# .###.
|
||||
|
||||
# z=-2, w=1
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=-1, w=1
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=0, w=1
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=1, w=1
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=2, w=1
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=-2, w=2
|
||||
# .....
|
||||
# .....
|
||||
# ..#..
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=-1, w=2
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=0, w=2
|
||||
# ###..
|
||||
# ##.##
|
||||
# #...#
|
||||
# .#..#
|
||||
# .###.
|
||||
|
||||
# z=1, w=2
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# z=2, w=2
|
||||
# .....
|
||||
# .....
|
||||
# ..#..
|
||||
# .....
|
||||
# .....
|
||||
|
||||
# After the full six-cycle boot process completes, 848 cubes are left in the
|
||||
# active state.
|
||||
|
||||
# Starting with your given initial configuration, simulate six cycles in a
|
||||
# 4-dimensional space. How many cubes are left in the active state after the
|
||||
# sixth cycle?
|
||||
|
||||
|
||||
def part_2() -> None:
|
||||
active_points = get_active_points(dim=4)
|
||||
for it in range(6):
|
||||
new_active_points = set()
|
||||
# check x,y,z point
|
||||
for x in range(-10 - it, it + 10):
|
||||
for y in range(-10 - it, it + 10):
|
||||
for z in range(-2 - it, it + 2):
|
||||
for w in range(-2 - it, it + 2):
|
||||
point = (x, y, z, w)
|
||||
|
||||
# for the current point, check the neighbors
|
||||
num_actives = 0
|
||||
for delta in iter.product(range(-1, 2), repeat=4):
|
||||
if delta != (0,) * 4:
|
||||
if (
|
||||
tuple(
|
||||
[a + b for a, b in zip(point, delta)]
|
||||
)
|
||||
in active_points
|
||||
):
|
||||
num_actives += 1
|
||||
|
||||
# apply rules
|
||||
if point in active_points and (
|
||||
num_actives == 2 or num_actives == 3
|
||||
):
|
||||
new_active_points.add(point)
|
||||
if point not in active_points and num_actives == 3:
|
||||
new_active_points.add(point)
|
||||
|
||||
# next iteration
|
||||
active_points = new_active_points
|
||||
print(f"After 6 cycles in 4D, we have {len(active_points)} active cubes")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
part_1()
|
||||
part_2()
|
||||
|
Loading…
Reference in New Issue
Block a user