2024-12-14 23:24:51 +08:00
|
|
|
#!/usr/bin/env/bash
|
|
|
|
|
|
|
|
FILE=input
|
|
|
|
MAP_WIDTH=101
|
|
|
|
MAP_HEIGHT=103
|
|
|
|
MEDIAN_WIDTH=$(( MAP_WIDTH / 2 - 1 ))
|
|
|
|
if [[ $(( MAP_WIDTH % 2 )) -eq 1 ]]
|
|
|
|
then
|
|
|
|
(( MEDIAN_WIDTH++ ))
|
|
|
|
fi
|
|
|
|
MEDIAN_HEIGHT=$(( MAP_HEIGHT / 2 - 1 ))
|
|
|
|
if [[ $(( MAP_HEIGHT % 2 )) -eq 1 ]]
|
|
|
|
then
|
|
|
|
(( MEDIAN_HEIGHT++ ))
|
|
|
|
fi
|
|
|
|
printf "Median width: %s, median height: %s\n" "$MEDIAN_WIDTH" "$MEDIAN_HEIGHT"
|
|
|
|
|
|
|
|
# Load bot positions and velocities
|
|
|
|
read -r -a BOT_ARRAY <<< "$( grep -Eo '[-0-9]*' "$FILE" | paste -s -d " " )"
|
|
|
|
#printf "%s " "${BOT_ARRAY[@]}"
|
|
|
|
#printf "\n"
|
|
|
|
printf "Bot array size: %s\n" "${#BOT_ARRAY[@]}"
|
|
|
|
|
|
|
|
# Load arrangements for every second
|
2024-12-15 00:38:13 +08:00
|
|
|
#for SECONDS in $( seq 1 9999 )
|
|
|
|
for SECONDS in $( seq 6514 6516 )
|
2024-12-14 23:24:51 +08:00
|
|
|
do
|
2024-12-15 00:38:13 +08:00
|
|
|
# Compute positions for each bot
|
|
|
|
printf "Working on +%s seconds.\n" "$SECONDS"
|
2024-12-14 23:24:51 +08:00
|
|
|
IFS=';'; read -r -a FINAL_ARRAY <<< "$(
|
|
|
|
for (( i=0; i<${#BOT_ARRAY[@]}; i+=4 ))
|
|
|
|
do
|
|
|
|
PX=${BOT_ARRAY[i]}
|
|
|
|
PY=${BOT_ARRAY[i+1]}
|
|
|
|
VX=${BOT_ARRAY[i+2]}
|
|
|
|
VY=${BOT_ARRAY[i+3]}
|
|
|
|
FINAL_X=$(( PX + ( VX * SECONDS ) ))
|
|
|
|
FINAL_Y=$(( PY + ( VY * SECONDS ) ))
|
|
|
|
printf "%s %s;" "$FINAL_X" "$FINAL_Y"
|
|
|
|
done <<< "${BOT_ARRAY[@]}"
|
|
|
|
)"
|
|
|
|
unset IFS
|
|
|
|
|
|
|
|
# Generate "empty" map
|
2024-12-15 00:38:13 +08:00
|
|
|
# Map is a 1d array
|
2024-12-14 23:24:51 +08:00
|
|
|
MAP_LEN=$(( MAP_HEIGHT * MAP_WIDTH ))
|
|
|
|
read -r -a MAP_ARRAY <<< "$(
|
|
|
|
for (( i=0; i<MAP_LEN; i++ ))
|
|
|
|
do
|
|
|
|
printf ". "
|
|
|
|
done
|
|
|
|
)"
|
|
|
|
|
|
|
|
# Calculate and map bot positions on the map
|
|
|
|
while read -r RAW_X RAW_Y
|
|
|
|
do
|
|
|
|
|
|
|
|
# Adjust positions to be on map
|
|
|
|
PX=$(( RAW_X % MAP_WIDTH ))
|
|
|
|
if [[ $PX -lt 0 ]]
|
|
|
|
then
|
|
|
|
PX=$(( MAP_WIDTH + PX ))
|
|
|
|
fi
|
|
|
|
PY=$(( RAW_Y % MAP_HEIGHT ))
|
|
|
|
if [[ $PY -lt 0 ]]
|
|
|
|
then
|
|
|
|
PY=$(( MAP_HEIGHT + PY ))
|
|
|
|
fi
|
|
|
|
|
2024-12-15 00:38:13 +08:00
|
|
|
# Calculate serial position and mark it
|
|
|
|
POSITION=$(( PX + (PY -1)*MAP_WIDTH ))
|
2024-12-14 23:24:51 +08:00
|
|
|
MAP_ARRAY[POSITION]=X
|
|
|
|
|
|
|
|
done <<< "$( printf "%s\n" "${FINAL_ARRAY[@]}" )"
|
|
|
|
|
|
|
|
# Print out map for manual review
|
2024-12-15 00:38:13 +08:00
|
|
|
#printf "%s" "${MAP_ARRAY[@]}" | fold -w $(( MAP_WIDTH )) | grep -o 'XXXXXXXXXX' && break
|
2024-12-14 23:24:51 +08:00
|
|
|
printf "%s" "${MAP_ARRAY[@]}" | fold -w $(( MAP_WIDTH ))
|
|
|
|
printf "\n"
|
2024-12-15 00:38:13 +08:00
|
|
|
|
|
|
|
printf "Final array length: %s, map array length: %s\n" "${#FINAL_ARRAY[@]}" "${#MAP_ARRAY[@]}"
|
2024-12-14 23:24:51 +08:00
|
|
|
printf "\n"
|
|
|
|
|
2024-12-15 00:38:13 +08:00
|
|
|
# Reset for next run
|
|
|
|
unset MAP_ARRAY
|
2024-12-14 23:24:51 +08:00
|
|
|
unset FINAL_ARRAY
|
|
|
|
done
|