diff --git a/2024/day-10/solution-2.sh b/2024/day-10/solution-2.sh new file mode 100644 index 0000000..2e588ce --- /dev/null +++ b/2024/day-10/solution-2.sh @@ -0,0 +1,147 @@ +#!/usr/bin/env bash + +FILE=input +MAP_WIDTH=$(( $( head -1 "$FILE" | wc -c ) -1 )) +MAP_LEN=$( < "$FILE" wc -l ) +read -r -a MAP_ARRAY <<< "$( paste -s -d "" <"$FILE" | sed -E 's/(.)(.)/\1 \2 /g' )" +printf "%s " "${MAP_ARRAY[@]}" +printf "\n" + +MAP_SIZE=${#MAP_ARRAY[@]} +for (( i=0; i&2 + + # Check if the end has been reached + # or no matching neighbors + if [[ $GET_NUM -eq 9 ]] || [[ ${#COMBINATIONS[@]} -eq 0 ]] + then + # Exit recursion + printf "%s " "${#COMBINATIONS[@]}" + #printf "%s " "${COMBINATIONS[@]}" >&2 + return + fi + + # Recurse + NEXT_NUM=$(( GET_NUM+=1 )) + TOTAL=0 + for INDEX in "${COMBINATIONS[@]}" + do + COUNT=$( + get_nine \ + "$NEXT_NUM" \ + "$( get_valid_directions "$INDEX" )" \ + "$INDEX" + ) + (( TOTAL += COUNT )) + done + printf "%s" "$TOTAL" +} + +get_valid_directions () { + + IDX=$1 + NUM=1 + + # Basically check for bounds + # For each direction, get multiplication of prime number + # corresponding to each direction + # 2 : Up + # 3 : Down + # 7 : Left + # 13 : Right + if [[ $(( IDX / MAP_LEN )) -gt 0 ]] + then + (( NUM*=2 )) + fi + if [[ $(( IDX / MAP_LEN )) -le $MAP_LEN ]] + then + (( NUM*=3 )) + fi + if [[ $(( IDX % MAP_WIDTH )) -ne 0 ]] + then + (( NUM*=7 )) + fi + if [[ $(( IDX % MAP_WIDTH )) -ne $(( MAP_WIDTH - 1 )) ]] + then + (( NUM*=13 )) + fi + + printf "%s" "$NUM" +} + +ITER=9999 +TOTAL=0 +for TRAILHEAD in "${TRAILHEADS[@]}" +do + COUNT=$( get_nine "1" "$( get_valid_directions "$TRAILHEAD" )" "$TRAILHEAD" ) + (( TOTAL+=COUNT )) + (( ITER-- )) + if [[ $ITER -eq 0 ]] ;then break; fi +done +printf "%s\n" "$TOTAL"