Day 17 part 1 , bash version

This commit is contained in:
2021-01-16 15:50:40 +01:00
parent 08538ec19f
commit 0ea2309e02
5 changed files with 376 additions and 5 deletions

View File

@@ -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
View 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

View File

@@ -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
View 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