#!/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 printf "trail: %s \n" "$TRAIL" >&2 printf "neighbors found : %s \n" "${COMBINATIONS[@]}" >&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[@]}" return fi # Recurse TOTAL=0 NEXT_NUM=$(( GET_NUM+=1 )) for INDEX in "${COMBINATIONS[@]}" do COUNT=$( get_nine \ "$NEXT_NUM" \ "$( get_valid_neighbors "$INDEX" )" \ "$INDEX" ) (( TOTAL+=COUNT )) done printf "%s" "$TOTAL" } get_valid_neighbors () { 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" } PATH_COUNT=0 ITER=999999 for TRAILHEAD in "${TRAILHEADS[@]}" do COUNT=$( get_nine "1" "$( get_valid_neighbors "$TRAILHEAD" )" "$TRAILHEAD" ) (( PATH_COUNT+=COUNT )) (( ITER-- )) if [[ $ITER -eq 0 ]] ;then break; fi done printf "%s\n" "$PATH_COUNT"