71 lines
1.6 KiB
Bash
71 lines
1.6 KiB
Bash
#!/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 "$@"
|