diff --git a/2024/day-11/solution-2-2.sh b/2024/day-11/solution-2-2.sh index a5a0e4b..5024f09 100644 --- a/2024/day-11/solution-2-2.sh +++ b/2024/day-11/solution-2-2.sh @@ -1,7 +1,6 @@ #!/usr/bin/env bash FILE=input -ITERATIONS=75 # Get max num size by squaring the largest number MAX_NUM_SIZE=0 @@ -16,42 +15,32 @@ done <<< "$( < input tr " " "\n" )" # Just pre-compute a large number of digits { -# Rule 1 -printf "0 1 \n" - -# Rule 2 : If even number of digits, split half half -for (( i=10 ; i<100; i+=1 )) -do - DIGIT_COUNT=${#i} - HALF=$(( DIGIT_COUNT / 2 )) - printf "%s %s %s \n" "$i" "$(( 10#${i:0:$HALF} ))" "$(( 10#${i:$HALF} ))" -done -for (( i=1000 ; i<10000; i+=1 )) -do - DIGIT_COUNT=${#i} - HALF=$(( DIGIT_COUNT / 2 )) - printf "%s %s %s \n" "$i" "$(( 10#${i:0:$HALF} ))" "$(( 10#${i:$HALF} ))" -done -for (( i=100000 ; i<1000000; i+=1 )) -do - DIGIT_COUNT=${#i} - HALF=$(( DIGIT_COUNT / 2 )) - printf "%s %s %s \n" "$i" "$(( 10#${i:0:$HALF} ))" "$(( 10#${i:$HALF} ))" -done - -# Rule 3 -for (( i=1; i<10; i+=1 )) -do - printf "%s %s \n" "$i" "$(( i * 2024 ))" -done -for (( i=100; i<1000; i+=1 )) -do - printf "%s %s \n" "$i" "$(( i * 2024 ))" -done -for (( i=10000; i<100000; i+=1 )) -do - printf "%s %s \n" "$i" "$(( i * 2024 ))" -done + # Rule 1 + printf "0 1 \n" + + # Rule 2 : If even number of digits, split half half + for (( i=10 ; i<100; i+=1 )) + do + DIGIT_COUNT=${#i} + HALF=$(( DIGIT_COUNT / 2 )) + printf "%s %s %s \n" "$i" "$(( 10#${i:0:$HALF} ))" "$(( 10#${i:$HALF} ))" + done + for (( i=1000 ; i<10000; i+=1 )) + do + DIGIT_COUNT=${#i} + HALF=$(( DIGIT_COUNT / 2 )) + printf "%s %s %s \n" "$i" "$(( 10#${i:0:$HALF} ))" "$(( 10#${i:$HALF} ))" + done + + # Rule 3 + for (( i=1; i<10; i+=1 )) + do + printf "%s %s \n" "$i" "$(( i * 2024 ))" + done + for (( i=100; i<1000; i+=1 )) + do + printf "%s %s \n" "$i" "$(( i * 2024 ))" + done } | sort -n > kv-cache printf "Cache built. KV size: %s \n" "$( wc -l kv-cache )" @@ -62,6 +51,7 @@ do KV_CACHE[${LINE%% *}]="${LINE#* }" done < kv-cache +# Use this function for cache misses NUM=0 get_num () { @@ -70,7 +60,7 @@ get_num () { # Rule 1 : Convert 0 to 1 if [[ $NUM -eq 0 ]] then - printf "1 \n" + printf "%s 1 \n" "$OCCUR" return fi @@ -79,31 +69,40 @@ get_num () { if [[ $(( DIGIT_COUNT % 2 )) -eq 0 ]] then HALF=$(( DIGIT_COUNT / 2 )) - printf "%s %s " "$(( 10#${NUM:0:$HALF} ))" "$(( 10#${NUM:$HALF} ))" + VALUE=( "$(( 10#${NUM:0:$HALF} ))" "$(( 10#${NUM:$HALF} ))" ) + printf "%s %s \n" "$OCCUR" "${VALUE[0]}" + printf "%s %s \n" "$OCCUR" "${VALUE[1]}" return fi # Rule 3 : Multiply by 2024 - printf "%s \n" "$(( NUM * 2024 ))" + printf "%s %s \n" "$OCCUR" "$(( NUM * 2024 ))" return } # Start the loop -tr " " "\n" < "$FILE" > temp-input +tr " " "\n" < "$FILE" | sort -n | uniq -c > temp-input for (( i=0; i<75; i++ )) do printf "%s Position %s\n" "$( date )" "$i" - while read -r NUM + #cat temp-input + while read -r OCCUR NUM do - if [[ -v ${KV_CACHE[$NUM]} ]] + if [[ -v KV_CACHE[$NUM] ]] then - printf "%s \n" "${KV_CACHE[$NUM]}" + for VAL in ${KV_CACHE[$NUM]} + do + printf "%s %s \n" "$OCCUR" "$VAL" + done else get_num "$NUM" fi done < temp-input | - tr " " "\n" | - grep -Eo '[0-9]*' | + grep -E '[0-9]*' | + tee temp-output | + sort | + uniq -c | + awk '{print ($1 * $2) " " $3}' | sponge temp-input done -printf "Final count: %s\n" "$(wc -l < temp-input)" +printf "Final count: %s\n" "$( awk '{print $1}' < temp-input | paste -s -d "+" | bc )"