Files
advent-of-code/2024/day-11/solution-1.sh
2024-12-11 15:04:49 +08:00

67 lines
1.4 KiB
Bash

#!/usr/bin/env bash
read -r -a ROCK_LIST <<< "$( cat input )"
BLINK_NUM=25
ROCK_RETURN=()
ROCK_NUM=0
blink_rock () {
#printf "Blinking rock : %s\n" "$ROCK_NUM" >&2
# Remove leading zeroes
ROCK_NUM=$(( 10#$ROCK_NUM ))
# Rule 1 : Convert 0 to 1
if [[ $ROCK_NUM -eq 0 ]]
then
ROCK_RETURN=( 1 )
return
fi
# Rule 2 : If even number of digits, split half half
DIGIT_COUNT=${#ROCK_NUM}
if [[ $(( DIGIT_COUNT % 2 )) -eq 0 ]] && [[ $DIGIT_COUNT -gt 0 ]]
then
HALF=$(( DIGIT_COUNT / 2 ))
read -r -a ROCK_RETURN <<< "$( printf "%s %s " "${ROCK_NUM:0:$HALF}" "${ROCK_NUM:$HALF}" )"
return
fi
# Rule 3 : Multiply by 2024
ROCK_RETURN=( $(( ROCK_NUM * 2024 )) )
return
}
ROCKS_TO_BLINK=()
BLINKED_ROCKS=()
# Updates the global array
blink_rocks () {
BLINKED_ROCKS=()
for ROCK in "${ROCKS_TO_BLINK[@]}"
do
ROCK_NUM=$ROCK
blink_rock
BLINKED_ROCKS+=( "${ROCK_RETURN[@]}" )
done
#printf "BLINKED_ROCKS: " >&2
#printf "%s " "${BLINKED_ROCKS[@]}" >&2
#printf "\n" >&2
}
FINAL_LIST=()
for ROCK_NUM in "${ROCK_LIST[@]}"
do
printf "Rock: %s\n" "$ROCK_NUM"
ROCKS_TO_BLINK=( "$ROCK_NUM" )
for (( i=0 ; i< BLINK_NUM; i++ ))
do
blink_rocks
ROCKS_TO_BLINK=( "${BLINKED_ROCKS[@]}" )
done
FINAL_LIST+=( "${BLINKED_ROCKS[@]}" )
done
printf "%s " "${FINAL_LIST[@]}"
printf "\n"
printf "%s\n" "${#FINAL_LIST[@]}"