#!/usr/bin/env bash MAP_FILE=input-map DIRECTIONS_FILE=input-movements MAP_WIDTH=$(( $( head -1 "$MAP_FILE" | wc -c ) -1 )) #MAP_HEIGHT=$( < "$MAP_FILE" wc -l ) # Load map read -r -a TEST_ARRAY <<< "$( < "$MAP_FILE" paste -s -d "" | sed -E 's/(.)(.)/\1 \2 /g' )" read -r -a MAP_ARRAY <<< "$( < "$MAP_FILE" paste -s -d "" | sed -E 's/(.)(.)/\1 \2 /g' )" printf "%s " "${MAP_ARRAY[@]}" | fold -w $(( MAP_WIDTH * 2 )) printf "\n" MAP_LEN=${#MAP_ARRAY[@]} # Count boxes BOX_COUNT=0 for (( i=0; i" ]] then DIRECTION_VALUE=$RIGHT fi NEXT_POSITION=$(( ROBOT_POSITION + DIRECTION_VALUE )) if [[ ${MAP_ARRAY[$NEXT_POSITION]} == "O" ]] # Box in front then END_POSITION=$(( NEXT_POSITION + DIRECTION_VALUE )) while [[ ${MAP_ARRAY[$END_POSITION]} == "O" ]] do (( END_POSITION+=DIRECTION_VALUE )) done if [[ ${MAP_ARRAY[$END_POSITION]} == '#' ]] then printf "Next: %s End: %s Stacked boxes. No change.\n" "${MAP_ARRAY[$NEXT_POSITION]}" "${MAP_ARRAY[$END_POSITION]}" continue # Boxes are stacked up against wall elif [[ ${MAP_ARRAY[$END_POSITION]} == "." ]] then printf "Next: %s End: %s Robot: %s Move boxes and robot\n" "${MAP_ARRAY[$NEXT_POSITION]}" "${MAP_ARRAY[$END_POSITION]}" "${MAP_ARRAY[$ROBOT_POSITION]}" # Move the box MAP_ARRAY[END_POSITION]=O MAP_ARRAY[NEXT_POSITION]=. # Move the robot MAP_ARRAY[ROBOT_POSITION]=. ROBOT_POSITION=$NEXT_POSITION MAP_ARRAY[ROBOT_POSITION]=@ fi elif [[ ${MAP_ARRAY[$NEXT_POSITION]} == "#" ]] # Wall in front, do nothing then printf "Next: %s Skipping\n" "${MAP_ARRAY[$NEXT_POSITION]}" continue elif [[ ${MAP_ARRAY[$NEXT_POSITION]} == "." ]] # Empty space, move forward then printf "Next: %s Move robot forward\n" "${MAP_ARRAY[$NEXT_POSITION]}" # Move the robot MAP_ARRAY[ROBOT_POSITION]=. ROBOT_POSITION=$NEXT_POSITION MAP_ARRAY[ROBOT_POSITION]=@ fi done <<< "$( < "$DIRECTIONS_FILE" sed -E 's/(.)(.)/\1 \2 /g' | tr ' ' '\n' )" printf "%s " "${MAP_ARRAY[@]}" | fold -w $(( MAP_WIDTH * 2 )) printf "\n" # Calculate GPS values for boxes SUM=0 BOX_COUNT=0 for (( i=0; i