#!/usr/bin/env bash unset PATH readonly PATH source ./utils/main.sh coord_to_index() { local width="$1" x="$2" y="$3" printf '%d' "$((y * width + x))" } index_to_coord() { local width="$1" index="$2" printf '%d %d\n' "$((index % width))" "$((index / width))" } p1() { local input="$1" width=0 height=0 local line arr=() x y dir='u' local -A visited while read -r line; do ((height++)) [[ "$width" ]] && width="${#line}" while IFS= read -rd '' -n 1 char; do [[ "$char" == $'\n' ]] && continue arr+=("$char") done <<<"$line" done <<<"$input" local i for i in "${!arr[@]}"; do [[ "${arr[i]}" == '^' ]] && { read -r x y <<<"$(index_to_coord "$width" "$i")" arr[i]="." visited=(["$x $y"]=1) break } done while :; do case "$dir" in u) ((y - 1 < 0)) && break [[ "${arr["$(coord_to_index "$width" "$x" "$((y - 1))")"]}" == '#' ]] && dir='r' && continue ((y--)) ;; r) ((x + 1 >= width)) && break [[ "${arr["$(coord_to_index "$width" "$((x + 1))" "$y")"]}" == '#' ]] && dir='d' && continue ((x++)) ;; d) ((y + 1 >= height)) && break [[ "${arr["$(coord_to_index "$width" "$x" "$((y + 1))")"]}" == '#' ]] && dir='l' && continue ((y++)) ;; l) ((x - 1 < 0)) && break [[ "${arr["$(coord_to_index "$width" "$((x - 1))" "$y")"]}" == '#' ]] && dir='u' && continue ((x--)) ;; *) : ;; esac visited+=(["$x $y"]=1) done printf '%s' "${#visited[@]}" } main "$@"