#!/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 )) read -r -a RESULTS <<< "$( for INDEX in "${COMBINATIONS[@]}" do RESULT=$( get_nine \ "$NEXT_NUM" \ "$( get_valid_directions "$INDEX" )" \ "$INDEX" ) printf "%s " "$RESULT" done )" printf "%s " "${RESULTS[@]}" #printf "%s " "${RESULTS[@]}" >&2 #printf "\n" >&2 } 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 read -r -a PEAKS <<< "$( get_nine "1" "$( get_valid_directions "$TRAILHEAD" )" "$TRAILHEAD" )" COUNT=$( printf "%s " "${PEAKS[@]}" | grep -Eo '[0-9]*' | sort -u | wc -l ) (( TOTAL+=COUNT )) (( ITER-- )) if [[ $ITER -eq 0 ]] ;then break; fi done printf "%s\n" "$TOTAL"