#!/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[@]}"