Day 17 part 1 , bash version
This commit is contained in:
@@ -20,7 +20,7 @@ ex1:
|
||||
@#$(TIME) ex1-c 2020 < $(INPUT) 2>&1
|
||||
|
||||
ex2:
|
||||
@$(TIME) ex2.bash < $(INPUT) 2>&1
|
||||
@#$(TIME) ex2.bash < $(INPUT) 2>&1
|
||||
@#$(TIME) ex1-c 30000000 < $(INPUT) 2>&1
|
||||
|
||||
clean:
|
||||
|
4
day17/OUTPUT
Normal file
4
day17/OUTPUT
Normal file
@@ -0,0 +1,4 @@
|
||||
ex1.bash : res=263
|
||||
time: 1:24.06 real, 60.13 user, 30.29 sys
|
||||
context-switch: 5369+166373, page-faults: 0+7362621
|
||||
|
257
day17/README
257
day17/README
@@ -144,7 +144,262 @@ After the full six-cycle boot process completes, 112 cubes are left in the activ
|
||||
|
||||
Starting with your given initial configuration, simulate six cycles. How many cubes are left in the active state after the sixth cycle?
|
||||
|
||||
To begin, get your puzzle input.
|
||||
Your puzzle answer was 263.
|
||||
|
||||
The first half of this puzzle is complete! It provides one gold star: *
|
||||
--- 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?
|
||||
|
||||
Answer:
|
||||
|
||||
Although it hasn't changed, you can still get your puzzle input.
|
||||
|
||||
You can also [Share] this puzzle.
|
||||
|
109
day17/ex1.bash
Executable file
109
day17/ex1.bash
Executable file
@@ -0,0 +1,109 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# ex1.bash: Advent2020 game, day 17/game 1.
|
||||
|
||||
CMD=${0##*/}
|
||||
#shopt -s extglob
|
||||
|
||||
declare -A life=()
|
||||
declare -i x=-1 y=-1 z=-1 res=0
|
||||
declare -i maxx maxy maxz
|
||||
|
||||
function print_life() {
|
||||
local -i x=0 y=0 z=0 foundx foundy
|
||||
for ((z=0; z<maxz; ++z)); do
|
||||
foundy=1
|
||||
for ((y=0; y<maxy; ++y)); do
|
||||
foundx=1
|
||||
for ((x=0; x<maxx; ++x)); do
|
||||
if [[ -v life[$x-$y-$z] ]]; then
|
||||
#printf "%d-%d-%d:" $x $y $z
|
||||
printf "%c" ${life["$x-$y-$z"]}
|
||||
foundx=1
|
||||
else
|
||||
printf "%c" "."
|
||||
fi
|
||||
done
|
||||
((foundx==1)) && foundy=1 && printf "\n"
|
||||
done
|
||||
((foundy==1)) && printf "z=%d\n\n" "$z"
|
||||
done
|
||||
|
||||
}
|
||||
|
||||
function count_neighbors () {
|
||||
local -i x=$1 y=$2 z=$3 x1 y1 z1 count=0
|
||||
local str=""
|
||||
|
||||
|
||||
for ((x1=x-1; x1<x+2; ++x1)); do
|
||||
for ((y1=y-1; y1<y+2; ++y1)); do
|
||||
for ((z1=z-1; z1<z+2; ++z1)); do
|
||||
if ((x1!=x || y1!=y || z1!=z)); then
|
||||
if [[ ${life[$x1-$y1-$z1]} == "#" ]]; then
|
||||
((count++))
|
||||
str="$str $x1-$y1-$z1"
|
||||
fi
|
||||
|
||||
fi
|
||||
done
|
||||
done
|
||||
done
|
||||
#((count)) && printf "neighbours (%d, %d, %d)=%s\n" "$x" "$y" "$z" "$str" >&2
|
||||
echo "$count"
|
||||
}
|
||||
|
||||
function run_cycle () {
|
||||
local -i x y z count=0
|
||||
local -A lifetmp=()
|
||||
|
||||
for ((x=0; x<maxx; ++x)); do
|
||||
for ((y=0; y<maxy; ++y)); do
|
||||
for ((z=0; z<maxz; ++z)); do
|
||||
count=$(count_neighbors "$x" "$y" "$z")
|
||||
if [[ ${life[$x-$y-$z]} == "#" ]]; then
|
||||
((count!=2 && count!=3)) && lifetmp[$x-$y-$z]="."
|
||||
else
|
||||
((count==3)) && lifetmp[$x-$y-$z]="#"
|
||||
fi
|
||||
done
|
||||
done
|
||||
done
|
||||
for k in "${!lifetmp[@]}"; do
|
||||
life[$k]=${lifetmp[$k]}
|
||||
done
|
||||
}
|
||||
|
||||
function count_active () {
|
||||
local k
|
||||
local -i count=0
|
||||
|
||||
for k in "${!life[@]}"; do
|
||||
if [[ ${life[$k]} == "#" ]]; then
|
||||
((count++))
|
||||
fi
|
||||
done
|
||||
echo "$count"
|
||||
}
|
||||
|
||||
x=6; y=6; z=6
|
||||
while read -r line; do
|
||||
if ((y==6)); then # 1st line
|
||||
((maxx=6+${#line}+6+1))
|
||||
((maxy=maxx))
|
||||
((maxz=maxx))
|
||||
fi
|
||||
for ((j=0; j<${#line}; ++j)); do
|
||||
((curx=x+j))
|
||||
life[$curx-$y-$z]=${line:j:1}
|
||||
done
|
||||
((y++))
|
||||
done
|
||||
for ((i=0; i<6; ++i)); do
|
||||
run_cycle
|
||||
done
|
||||
res=$(count_active)
|
||||
|
||||
printf "%s : res=%d\n" "$CMD" "$res"
|
||||
|
||||
exit 0
|
Reference in New Issue
Block a user