|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +FILE="$1" |
| 4 | +# FILE=input.txt |
| 5 | + |
| 6 | +mapfile -t grid < "$FILE" |
| 7 | + |
| 8 | +h=${#grid[@]} |
| 9 | +w=${#grid[0]} |
| 10 | + |
| 11 | +print_grid() { |
| 12 | + local x y |
| 13 | + local rx=$1 |
| 14 | + local ry=$2 |
| 15 | + local r=${3:-32} |
| 16 | + for ((y=0; y<h; y++)); do |
| 17 | + for ((x=0; x<w; x++)); do |
| 18 | + if [[ x -eq rx && y -eq ry ]]; then |
| 19 | + RESET_ME=1 |
| 20 | + echo -ne '\033['$r'm' |
| 21 | + fi |
| 22 | + if [[ -z ${cache[$x,$y]} ]]; then |
| 23 | + printf ${grid[y]:x:1} |
| 24 | + else |
| 25 | + local cached=${cache[$x,$y]} |
| 26 | + printf $((cached % 10)) |
| 27 | + |
| 28 | + fi |
| 29 | + if [[ -n $RESET_ME ]]; then |
| 30 | + unset RESET_ME |
| 31 | + echo -ne '\033[39m' |
| 32 | + fi |
| 33 | + done |
| 34 | + echo |
| 35 | + done |
| 36 | +} |
| 37 | + |
| 38 | +q=() |
| 39 | +for ((y=0; y<h; y++)); do |
| 40 | + for ((x=0; x<w; x++)); do |
| 41 | + if [[ ${grid[y]:x:1} == S ]]; then |
| 42 | + sx=$x |
| 43 | + sy=$((y+1)) |
| 44 | + q+=($x $sy 'v') |
| 45 | + break 2 |
| 46 | + fi |
| 47 | + done |
| 48 | +done |
| 49 | +print_grid ${q[0]} $((q[1]-1)) 1>&2 |
| 50 | + |
| 51 | +set_grid() { |
| 52 | + local x=$1 |
| 53 | + local y=$2 |
| 54 | + local c=$3 |
| 55 | + grid[y]=${grid[y]:0:x}$c${grid[y]:x+1} |
| 56 | +} |
| 57 | + |
| 58 | +declare -A cache |
| 59 | + |
| 60 | +count=1 |
| 61 | +while [[ ${#q[@]} -gt 0 ]]; do |
| 62 | + end=${#q[@]} |
| 63 | + ((end-=3)) |
| 64 | + read x y z <<< "${q[end]} ${q[end+1]} ${q[end+2]}" |
| 65 | + # read x y z <<< "${q[0]} ${q[1]} ${q[2]}" |
| 66 | + q=(${q[@]:0:end}) |
| 67 | + # q=(${q[@]:3}) |
| 68 | + c=${grid[y]:x:1} |
| 69 | + cached=${cache[$x,$y]} |
| 70 | + if [[ $z == '|' ]]; then |
| 71 | + below=${cache[$x,$((y+1))]} |
| 72 | + cache[$x,$y]=${below:-1} |
| 73 | + # print_grid $x $y 35 1>&2 |
| 74 | + foo=0 |
| 75 | + elif [[ $z == '^' ]]; then |
| 76 | + left=${cache[$((x-1)),$y]} |
| 77 | + right=${cache[$((x+1)),$y]} |
| 78 | + cache[$x,$y]=$((left+right)) |
| 79 | + # print_grid $x $y 35 1>&2 |
| 80 | + foo=0 |
| 81 | + elif [[ -n "$cached" ]]; then |
| 82 | + continue |
| 83 | + elif [[ $c == '.' || $c == '|' ]]; then |
| 84 | + set_grid $x $y '|' |
| 85 | + # print_grid $x $y 33 1>&2 |
| 86 | + q+=($x $y '|') |
| 87 | + q+=($x $((y+1)) 'v') |
| 88 | + elif [[ $c == '^' ]]; then |
| 89 | + q+=($x $y '^') |
| 90 | + q+=($((x+1)) $y 'v') |
| 91 | + q+=($((x-1)) $y 'v') |
| 92 | + elif [[ $c == '|' ]]; then |
| 93 | + v=${cache[$x,$y]} |
| 94 | + # print_grid $x $y 31 1>&2 |
| 95 | + # ((count+=v)) |
| 96 | + fi |
| 97 | +done |
| 98 | +# print_grid |
| 99 | +echo ${cache[$sx,$sy]} |
0 commit comments