Day 17 part 1 , bash version
This commit is contained in:
9
README
9
README
@@ -1,4 +1,7 @@
|
|||||||
advent of code 2020:
|
advent of code 2020: https://adventofcode.com/2020
|
||||||
https://adventofcode.com/2020
|
|
||||||
|
|
||||||
Here are solutions to the 2 daily exercises in both C and bash.
|
My solutions to the 2 daily exercises in both C and Bash (also Cobol for day 1).
|
||||||
|
|
||||||
|
Status:
|
||||||
|
|
||||||
|
Done: Days 1-16: parts 1 and 2
|
||||||
|
@@ -20,7 +20,7 @@ ex1:
|
|||||||
@#$(TIME) ex1-c 2020 < $(INPUT) 2>&1
|
@#$(TIME) ex1-c 2020 < $(INPUT) 2>&1
|
||||||
|
|
||||||
ex2:
|
ex2:
|
||||||
@$(TIME) ex2.bash < $(INPUT) 2>&1
|
@#$(TIME) ex2.bash < $(INPUT) 2>&1
|
||||||
@#$(TIME) ex1-c 30000000 < $(INPUT) 2>&1
|
@#$(TIME) ex1-c 30000000 < $(INPUT) 2>&1
|
||||||
|
|
||||||
clean:
|
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?
|
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:
|
Answer:
|
||||||
|
|
||||||
|
Although it hasn't changed, you can still get your puzzle input.
|
||||||
|
|
||||||
You can also [Share] this puzzle.
|
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