Files
advent-of-code/2024/day-10/solution-1.sh
2024-12-10 23:25:35 +08:00

152 lines
3.3 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 ))
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"