gpt4 book ai didi

bash - 在 x 和 y 轴上查找坐标对。

转载 作者:行者123 更新时间:2023-11-29 09:46:37 25 4
gpt4 key购买 nike

我参加了技术支持职位的面试测试。我想我做得不好,因为他们没有回电话。我不关心这份工作,但有一个问题困扰着我,因为我只能弄清楚一半。我有一个机器人能够读取每行包含一条指令的指令。 “L”表示左转,“R”表示右转,数字表示向前移动 #n 步。机器人面朝北方,坐标为(0,0)这些是说明:

R
L
L
9
4
1
7
9
R
2

因此说明上说 - 向右转 90 度(使其朝东),然后向左再向左转(使其朝西)向前走 30 步,然后顺时针转 90 度(使其朝北)并向前移动两步。他们要我编写一个脚本来计算最大距离和坐标对(x 和 y 值)
他们在上面的说明中给了我答案,机器人从起点开始行走的最大距离是30.07,坐标对是(-30, 2)

我了解到机器人在视觉上移动并编写了一个 bash 数组,该数组将 x 的值加 10 以进行顺时针运动,并从 x 的值中减去 10 以进行逆时针运动。便宜的 bash 数组(bash 3.2 不支持数组)将 x VALUE 与 KEY 匹配,KEY 是 360 度位置或四个箭头键之一。该脚本在向前移动 n# 步之前保存最后一条指令。我不知道如何在最大距离和坐标对中编写脚本。它是一个代数 x 和 y 轴函数——但不知道如何在 bash 中添加它。

#!/bin/bash 
#set -x


dial_map=("up_1:10" "right_1:20" "down_1:30" "left_1:40"
"up_2:50" "right_2:60" "down_2:70" "left_2:80"
"up_3:90" "right_3:100" "down_3:110" "left_3:120")
x=50 # the robot starts at the up or north position
# once clockwise click adds ten, one counter clockwise minus 10 from x value.

IFS=$'\n' read -d"" -r -a directives < directions.txt

for i in "${directives[@]}"
do
if [ "$i" == "R" ] ; then
#echo "R is clockwise"
x=$(( $x + 10 ))
#echo "x is $x"
for click in "${dial_map[@]}" ; do
KEY=${click%%:*}
VALUE=${click#*:}
if [ "$x" -eq "$VALUE" ] ; then
keytab=$KEY
#echo "the keyboard command is $keytab"
fi
#sleep 1
done
elif [ "$i" == "L" ] ; then
#echo "L is counterclock"
x=$(( $x - 10 ))
#echo "x is $x"
for click in "${dial_map[@]}" ; do
KEY=${click%%:*}
VALUE=${click#*:}
if [ "$x" -eq "$VALUE" ] ; then
keytab=$KEY
#echo "the keyboard command is $keytab"
fi
#sleep 1
done
else
echo "Please move the cursor $i times $keytab"
sleep 1
fi
done

在 bash 中查找 x 和 y 坐标

最佳答案

这是一种无需关联数组即可执行此操作的方法,如果我没看错的话,这是一项要求——实际上我最初根本没有读取任何数组;这就是我使用这么多变量的原因。您可以使用关联数组代替我使用的 case 语句。我对指令进行了硬编码,但从文件中读取它们是微不足道的。在注释和 echo 语句之间,希望它是不言自明的。

#!/bin/bash - 

inst=(R L L 9 4 1 7 9 R 2)
# compass to cartesian translation
# x = 1 : N
# ^
# |
# y = -1 : W <---------> y = 1 : E
# |
# v
# x = -1 : S

startloc_x=0
startloc_y=0
newloc_x=0
newloc_y=0
dir_x=1
dir_y=0
a=0;
for i in ${inst[@]}; do
((a++))
echo "[$a] Next Instruction: $i"
slct="${i}${dir_x}${dir_y}"

# lookup table for case statement
#
# X Y turning Right turning left
# 1 0 0 1 0 -1
# 0 1 -1 0 1 0
# -1 0 0 -1 0 1
# 0 -1 1 0 -1 0
case $slct in
R10|L-10)
dir_x=0
dir_y=1
;;
R01|L0-1)
dir_x=-1
dir_y=0
;;
R-10|L10)
dir_x=0
dir_y=-1
;;
R0-1|L01)
dir_x=1
dir_y=0
;;
*)
(( newloc_x += $i * dir_x ))
(( newloc_y += $i * dir_y ))
;;
esac
echo "[$a] Current location (x,y) = ($newloc_x, $newloc_y)"
echo "[$a] Current direction (x,y) = ($dir_x, $dir_y)"
echo
done
echo;echo "---"
echo "Finished processing $a instructions"
echo "Starting Location: (x,y) ($startloc_x, $startloc_y)"
echo "Ending Location: (x,y) ($newloc_x, $newloc_y)"
echo "Final Direction: (x,y) ($dir_x, $dir_y)"
delta_x=0
delta_y=0
((delta_x = $newloc_x - $startloc_x ))
((delta_y = $newloc_y - $startloc_y ))
distance=`echo "sqrt( (${delta_x}.000)^2 + (${delta_y}.000)^2 )" | bc`
echo "Distance traveled = $distance"
echo

最终输出:

Finished processing 10 instructions
Starting Location: (x,y) (0, 0)
Ending Location: (x,y) (2, -30)
Final Direction: (x,y) (1, 0)
Distance traveled = 30.066

关于bash - 在 x 和 y 轴上查找坐标对。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37557356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com