2024-12-15 15:50:45 +08:00
|
|
|
#!/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
|
2024-12-15 16:14:11 +08:00
|
|
|
read -r -a TEST_ARRAY <<< "$( < "$MAP_FILE" paste -s -d "" | sed -E 's/(.)(.)/\1 \2 /g' )"
|
2024-12-15 15:50:45 +08:00
|
|
|
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<MAP_LEN; i++ ))
|
|
|
|
do
|
|
|
|
if [[ ${MAP_ARRAY[i]} == "O" ]]
|
|
|
|
then
|
|
|
|
(( BOX_COUNT++ ))
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
printf "Box count: %s\n" "$BOX_COUNT"
|
|
|
|
|
|
|
|
# Get robot position
|
|
|
|
for (( i=0; i<MAP_LEN; i++ ))
|
|
|
|
do
|
|
|
|
if [[ ${MAP_ARRAY[i]} == "@" ]]
|
|
|
|
then
|
|
|
|
ROBOT_POSITION=$i
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
printf "Robot position : %s\n" "$ROBOT_POSITION"
|
|
|
|
|
|
|
|
# Hardcode direction values
|
|
|
|
UP=$(( - MAP_WIDTH ))
|
|
|
|
DOWN=$MAP_WIDTH
|
|
|
|
LEFT=-1
|
|
|
|
RIGHT=1
|
|
|
|
|
|
|
|
# Iterate through directions
|
2024-12-15 16:18:50 +08:00
|
|
|
MOVES=0
|
2024-12-15 15:50:45 +08:00
|
|
|
while read -r DIRECTION
|
|
|
|
do
|
|
|
|
|
|
|
|
# Interpret directions
|
|
|
|
if [[ $DIRECTION == "^" ]]
|
|
|
|
then
|
|
|
|
DIRECTION_VALUE=$UP
|
|
|
|
elif [[ $DIRECTION == "v" ]]
|
|
|
|
then
|
|
|
|
DIRECTION_VALUE=$DOWN
|
|
|
|
elif [[ $DIRECTION == "<" ]]
|
|
|
|
then
|
|
|
|
DIRECTION_VALUE=$LEFT
|
|
|
|
elif [[ $DIRECTION == ">" ]]
|
|
|
|
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
|
2024-12-15 16:14:11 +08:00
|
|
|
printf "Next: %s End: %s Stacked boxes. No change.\n" "${MAP_ARRAY[$NEXT_POSITION]}" "${MAP_ARRAY[$END_POSITION]}"
|
2024-12-15 16:18:50 +08:00
|
|
|
: # Boxes are stacked up against wall
|
2024-12-15 15:50:45 +08:00
|
|
|
elif [[ ${MAP_ARRAY[$END_POSITION]} == "." ]]
|
|
|
|
then
|
2024-12-15 16:14:11 +08:00
|
|
|
printf "Next: %s End: %s Robot: %s Move boxes and robot\n" "${MAP_ARRAY[$NEXT_POSITION]}" "${MAP_ARRAY[$END_POSITION]}" "${MAP_ARRAY[$ROBOT_POSITION]}"
|
2024-12-15 15:50:45 +08:00
|
|
|
# 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
|
2024-12-15 16:14:11 +08:00
|
|
|
printf "Next: %s Skipping\n" "${MAP_ARRAY[$NEXT_POSITION]}"
|
2024-12-15 16:18:50 +08:00
|
|
|
:
|
2024-12-15 15:50:45 +08:00
|
|
|
elif [[ ${MAP_ARRAY[$NEXT_POSITION]} == "." ]] # Empty space, move forward
|
|
|
|
then
|
2024-12-15 16:14:11 +08:00
|
|
|
printf "Next: %s Move robot forward\n" "${MAP_ARRAY[$NEXT_POSITION]}"
|
2024-12-15 15:50:45 +08:00
|
|
|
# Move the robot
|
|
|
|
MAP_ARRAY[ROBOT_POSITION]=.
|
|
|
|
ROBOT_POSITION=$NEXT_POSITION
|
|
|
|
MAP_ARRAY[ROBOT_POSITION]=@
|
|
|
|
fi
|
2024-12-15 16:18:50 +08:00
|
|
|
(( MOVES++ ))
|
2024-12-15 15:50:45 +08:00
|
|
|
|
2024-12-15 16:18:50 +08:00
|
|
|
done <<< "$( < "$DIRECTIONS_FILE" paste -s -d "" | sed -E 's/(.)(.)/\1 \2 /g' | tr ' ' '\n' )"
|
|
|
|
printf "Moves: %s\n" "$MOVES"
|
2024-12-15 15:50:45 +08:00
|
|
|
|
|
|
|
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<MAP_LEN; i++ ))
|
|
|
|
do
|
|
|
|
if [[ ${MAP_ARRAY[i]} == "O" ]]
|
|
|
|
then
|
|
|
|
(( BOX_COUNT++ ))
|
2024-12-15 16:14:11 +08:00
|
|
|
X=$(( i % MAP_WIDTH ))
|
|
|
|
Y=$(( i / MAP_WIDTH * 100 ))
|
|
|
|
GPS=$(( X + Y ))
|
|
|
|
printf "Box %s X: %s Y: %s GPS: %s\n" "$i" "$X" "$Y" "$GPS"
|
|
|
|
(( SUM+=GPS ))
|
2024-12-15 15:50:45 +08:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
printf "Sum: %s\n" "$SUM"
|
|
|
|
printf "Box count: %s\n" "$BOX_COUNT"
|
2024-12-15 16:14:11 +08:00
|
|
|
|
|
|
|
# Compare and test if walls have moved
|
|
|
|
for (( i=0; i<MAP_LEN; i++ ))
|
|
|
|
do
|
|
|
|
if [[ ${TEST_ARRAY[i]} == "#" ]]
|
|
|
|
then
|
|
|
|
if [[ ${TEST_ARRAY[i]} != "${MAP_ARRAY[i]}" ]]
|
|
|
|
then
|
|
|
|
printf "Index %s Wall changed.\n" "$i"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
done
|