145 lines
3.0 KiB
Bash
145 lines
3.0 KiB
Bash
#!/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<MAP_SIZE ; i++ ))
|
|
do
|
|
if [[ ${MAP_ARRAY[i]} -eq 0 ]]
|
|
then
|
|
#printf "Trailhead found at position %s\n" "$i"
|
|
TRAILHEADS+=( "$i" )
|
|
#elif [[ ${MAP_ARRAY[i]} -eq 9 ]]
|
|
#then
|
|
# #printf "Peak found at position %s\n" "$i"
|
|
# PEAKS+=( "$i" )
|
|
fi
|
|
done
|
|
#printf "%s " "${TRAILHEADS[@]}"
|
|
#printf "\n"
|
|
#printf "%s " "${PEAKS[@]}"
|
|
#printf "\n"
|
|
|
|
get_nine () {
|
|
|
|
# Trails are explored areas
|
|
# Paths are areas to explore
|
|
GET_NUM=$1
|
|
DIRECTIONS=$2
|
|
TRAIL=$3
|
|
COMBINATIONS=()
|
|
|
|
# For each direction, get multiplication of prime number
|
|
# corresponding to each direction
|
|
# Modulus for valid directions is 0
|
|
# 2 : Up
|
|
# 3 : Down
|
|
# 7 : Left
|
|
# 13 : Right
|
|
if [[ $(( DIRECTIONS % 2 )) -eq 0 ]]
|
|
then
|
|
INDEX=$(( TRAIL - MAP_WIDTH ))
|
|
if [[ ${MAP_ARRAY[INDEX]} -eq $GET_NUM ]]
|
|
then
|
|
COMBINATIONS+=( "$INDEX" )
|
|
fi
|
|
fi
|
|
if [[ $(( DIRECTIONS % 3 )) -eq 0 ]]
|
|
then
|
|
INDEX=$(( TRAIL + MAP_WIDTH ))
|
|
if [[ ${MAP_ARRAY[INDEX]} -eq $GET_NUM ]]
|
|
then
|
|
COMBINATIONS+=( "$INDEX" )
|
|
fi
|
|
fi
|
|
if [[ $(( DIRECTIONS % 7 )) -eq 0 ]]
|
|
then
|
|
INDEX=$(( TRAIL - 1 ))
|
|
if [[ ${MAP_ARRAY[INDEX]} -eq $GET_NUM ]]
|
|
then
|
|
COMBINATIONS+=( "$INDEX" )
|
|
fi
|
|
fi
|
|
if [[ $(( DIRECTIONS % 13 )) -eq 0 ]]
|
|
then
|
|
INDEX=$(( TRAIL + 1 ))
|
|
if [[ ${MAP_ARRAY[INDEX]} -eq $GET_NUM ]]
|
|
then
|
|
COMBINATIONS+=( "$INDEX" )
|
|
fi
|
|
fi
|
|
#PRINT1=$( printf "%s " "$TRAIL" )
|
|
#PRINT2=$( printf "%s " "${COMBINATIONS[@]}" )
|
|
#printf "trail: %s, Get: %s, combinations: %s \n" "$PRINT1" "$GET_NUM" "$PRINT2" >&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"
|
|
}
|
|
|
|
TOTAL=0
|
|
for TRAILHEAD in "${TRAILHEADS[@]}"
|
|
do
|
|
COUNT=$( get_nine "1" "$( get_valid_directions "$TRAILHEAD" )" "$TRAILHEAD" )
|
|
(( TOTAL+=COUNT ))
|
|
done
|
|
printf "%s\n" "$TOTAL"
|