diff --git a/2024/day-12/solution-1.sh b/2024/day-12/solution-1.sh index ea81264..e2745e6 100644 --- a/2024/day-12/solution-1.sh +++ b/2024/day-12/solution-1.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash FUNCNEST=99999 -FILE=test-input-1 +FILE=input read -r -a MAP_ARRAY <<< "$( < "$FILE" paste -s -d "" | sed -E 's/(.)/\1\ /g' )" MAP_LEN=${#MAP_ARRAY[@]} MAP_WIDTH=$(( $( head -1 "$FILE" | wc -c ) -1 )) diff --git a/2024/day-12/solution-2.sh b/2024/day-12/solution-2.sh index 56fbe70..8448570 100644 --- a/2024/day-12/solution-2.sh +++ b/2024/day-12/solution-2.sh @@ -1,11 +1,10 @@ #!/usr/bin/env bash FUNCNEST=99999 -FILE=input +FILE=test-input-1 read -r -a MAP_ARRAY <<< "$( < "$FILE" paste -s -d "" | sed -E 's/(.)/\1\ /g' )" MAP_LEN=${#MAP_ARRAY[@]} MAP_WIDTH=$(( $( head -1 "$FILE" | wc -c ) -1 )) -MAP_WIDTH_N1=$(( MAP_WIDTH -1 )) MAP_WIDTH_INV=$(( 0 - MAP_WIDTH )) MAP_HEIGHT=$( < "$FILE" wc -l ) printf "Len: %s Width: %s Height: %s\n" "$MAP_LEN" "$MAP_WIDTH" "$MAP_HEIGHT" @@ -17,25 +16,30 @@ check_adjacent () { DIFF=$(( $2 - $1 )) # Valid adjacent distances - if [[ $DIFF -eq 1 ]] || [[ $DIFF -eq -1 ]] || [[ $DIFF -eq $MAP_WIDTH ]] || [[ $DIFF -eq $MAP_WIDTH_INV ]] ; then : else return 1 ; fi + if [[ $DIFF -eq 1 ]] || [[ $DIFF -eq -1 ]] || [[ $DIFF -eq $MAP_WIDTH ]] || [[ $DIFF -eq $MAP_WIDTH_INV ]] ; then : ; else return 1 ; fi # Check for left/right bounds if [[ $DIFF -eq 1 ]] && [[ $(( $2 % MAP_WIDTH )) -eq 0 ]] ; then return 1 ; fi if [[ $DIFF -eq -1 ]] && [[ $(( $1 % MAP_WIDTH )) -eq 0 ]] ; then return 1 ; fi } -# Basically recurse over mapping and "consume" all adjacent tiles +# Basically recurse over kv and "consume" all adjacent tiles +# All tiles that are consumed are adjacent check_and_unset () { local KV_I=${1%% *} # Remove trailing whitespace (( AREA++ )) VALUE=${KV_CACHE[$KV_I]} unset "KV_CACHE[$KV_I]" # "Take" it + printf "max: %s peri: %s area: %s key: %s val: %s\n" "$MAX_PERI" "$PERI_NUM" "$AREA" "$1" "$VALUE" >&2 + # As a square, expect width and height to always be preserved + # Recursion should always be in sequence + unset IFS; read -r -a VAL_ARRAY <<< "$VALUE" # Loop through adjacent tiles and recurse - for VAL in "${VAL_ARRAY[@]}" + for VAL in "${VAL_ARRAY[@]}" # VAL_ARRAY is always sorted do VAL_IDX=${VAL%% *} if [[ -v KV_CACHE[$VAL_IDX] ]] # Check if tile has been "taken" @@ -67,7 +71,7 @@ do declare -A KV_CACHE IFS=':'; while read -r VAR1 VAR2 do - printf "VAR1: %s VAR2: %s\n" "$VAR1" "$VAR2" >&2 + #printf "VAR1: %s VAR2: %s\n" "$VAR1" "$VAR2" >&2 KV_CACHE[$VAR1]=$VAR2 done <<< "$( # Find all adjacent tiles @@ -95,9 +99,9 @@ do do CHAR=${CH%% *} # Remove trailing whitespace if ! [[ -v KV_CACHE[$CHAR] ]]; then continue; fi - MAX_PERI=4 - PERI_NUM=0 + PERI_NUM=4 # Number of perimeters of a square AREA=0 + ROW=0 check_and_unset "$CHAR" printf "char: %s max: %s peri: %s area: %s\n" "$CHAR" "$MAX_PERI" "$PERI_NUM" "$AREA" >&2 printf "%s\n" "$(( PERI_NUM * AREA ))" diff --git a/2024/day-13/solution-2.sh b/2024/day-13/solution-2.sh index 27ff087..efe5584 100644 --- a/2024/day-13/solution-2.sh +++ b/2024/day-13/solution-2.sh @@ -2,7 +2,7 @@ FILE=input read -r -a INPUT_ARRAY <<< "$( sed -E 's/.*X[\+\=]([0-9]+), Y[\+\=]([0-9]+)/\1 \2 /g' < "$FILE" | paste -s -d " " )" -printf "%s\n" "${INPUT_ARRAY[@]}" >&2 +#printf "%s\n" "${INPUT_ARRAY[@]}" >&2 INPUT_LEN=${#INPUT_ARRAY[@]} TOTAL_TOKEN=0 @@ -12,32 +12,52 @@ do C=${INPUT_ARRAY[i+1]} B=${INPUT_ARRAY[i+2]} D=${INPUT_ARRAY[i+3]} - X="10000000000000${INPUT_ARRAY[i+4]}" - Y="10000000000000${INPUT_ARRAY[i+5]}" + X=$(( 10000000000000 + ${INPUT_ARRAY[i+4]} )) + Y=$(( 10000000000000 + ${INPUT_ARRAY[i+5]} )) - I=$(( ( B*Y - D*X ) / ( B*C - D*A ) )) # Button A - J=$(( ( X - A*I ) / B )) # Button B + # Check if moduluses are eq 0 before proceeding + I_MODULUS=$(( (B*Y - D*X) % (B*C - D*A) )) + echo "I_MODULUS: $I_MODULUS" + if [[ $I_MODULUS -eq 0 ]] + then + I=$(( ( B*Y - D*X ) / ( B*C - D*A ) )) # Button A + else + continue + fi + J_MODULUS=$(( ( X - A*I ) % B )) + echo "J_MODULUS: $J_MODULUS" + if [[ $J_MODULUS -eq 0 ]] + then + J=$(( ( X - A*I ) / B )) # Button b + else + continue + fi - TOKEN=$(( I*3 + J*1 )) + # Numbers have to position integers + if [[ $I -lt 1 ]] || [[ $J -lt 1 ]] + then + continue + fi { + echo "( $B*$Y - $D*$X ) / ( $B*$C - $D*$A )" >&2 # Button A + echo "( $X - $A*$I ) / $B )" >&2 # Button B printf "Answer: I= %s, J= %s\n" "$I" "$J" + #echo "Modulus I: $(( ( B*Y - D*X ) % ( B*C - D*A ) ))" # Button A + #echo "Modulus J: $(( ( X - A*I ) % B ))" # Button B printf "Verify answer : %s to %s, %s to %s\n" "$(( A*I + B*J ))" "$X" "$(( C*I + D*J ))" "$Y" printf "Total cost: %s\n" "$(( I*3 + J*1 ))" } >&2 - if ! [[ $(( A*I + B*J )) -eq $X ]] + TOKEN=$(( I*3 + J*1 )) # Calculate token cost + + # Verify numbers with results for positions + if ! [[ $(( A*I + B*J )) -eq $X ]] # X position then continue - elif ! [[ $(( C*I + D*J )) -eq $Y ]] + elif ! [[ $(( C*I + D*J )) -eq $Y ]] # Y position then continue - elif [[ $I -lt 1 ]] || [[ $J -lt 1 ]] - then - continue - #elif [[ $I -gt 100 ]] || [[ $J -gt 100 ]] - #then - # continue else (( TOTAL_TOKEN+=TOKEN )) fi