#!/usr/bin/env bash ARRAY_SHAPE=10 # It's a square FILENAME=test-input read -r -a MAP_ARRAY <<< "$( paste -s -d '' "$FILENAME" | sed -E 's/(.)/\1\ /g' )" # Get initial position POSITION=$(( ( $( grep -n '\^' "$FILENAME" | cut -f1 -d: ) -1 ) * ARRAY_SHAPE -1 + $( grep -o '.*\^' "$FILENAME" | wc -c ) -1 )) MAP_ARRAY[POSITION]=X # Remove position after save # up = 0, right = 1, down = 2, left = 3, following 90 degree turn TURNS=0 while true do EXIT=1 # Get direction and travel DIRECTION=$(( TURNS % 4 )) if [[ $DIRECTION -eq 0 ]] # up then TRAVEL=-$ARRAY_SHAPE LIMIT=$(( POSITION % ARRAY_SHAPE )) elif [[ $DIRECTION -eq 1 ]] # right then TRAVEL=1 LIMIT=$(( (POSITION / ARRAY_SHAPE + 1) * ARRAY_SHAPE )) # Never verified elif [[ $DIRECTION -eq 2 ]] # down then TRAVEL=$ARRAY_SHAPE LIMIT=$(( (POSITION % ARRAY_SHAPE) + (ARRAY_SHAPE * ARRAY_SHAPE) )) elif [[ $DIRECTION -eq 3 ]] # left then TRAVEL=-1 LIMIT=$(( (POSITION / ARRAY_SHAPE) * ARRAY_SHAPE )) # Never verified fi while [[ ${MAP_ARRAY[$POSITION+$TRAVEL]} != '#' ]] do if [[ $POSITION -eq $LIMIT ]] # Walked out then EXIT=0 break fi MAP_ARRAY[POSITION]=X # Mark walking path (( POSITION+=TRAVEL )) done if [[ $EXIT -eq 0 ]] ; then break ; fi # Walked out (( TURNS++ )) done # Count all coordinates printf "%s" "${MAP_ARRAY[@]}" | tee travel-path | sed 's/[^X]//g' | wc -c < travel-path fold -w $ARRAY_SHAPE