为儿童玩机器人-我会收到哪一封信?


12

TL; DR:给定一个字符数组,并且在该数组的起始位置有一个机械手,编写一种算法,该算法可以读取具有运动的字符串(F“向前”,R“向右旋转90度”和L“ 向右旋转90度”左”),然后计算机器人的结束位置。全文中有更多详细信息。

我们在家中有一个非常简单的面向儿童的可编程设备:带有按钮的小型车辆,可以使车辆前进,向左转90度或向右转90度。类似于以下内容:

鼠标车

我们也有一个泡沫垫,上面写着这样的字母:

游戏垫

所有这些的目的是一次教孩子们字母和编程的基础。

挑战

假设我们像这样随机安排泡沫垫:

+---+---+---+---+---+---+---+
| E | R | L | B | I | X | N |
+---+---+---+---+---+---+---+
| O | A | Q | Y | C | T | G |
+---+---+---+---+---+---+---+
| F | W | H | P | D | Z | S |
+---+---+---+---+---+---+---+
    | K | V | U | M | J |   
    +---+---+---+---+---+
            |   |
            +---+

假设我们还修改了车辆,以便当我们编写“ goward”命令时,车辆将在垫子上精确地向前移动一个正方形。因此,如果车辆在U广场上并向北行驶,它将恰好停在P广场上。

车辆开始行驶之前,所有指示均已提供给车辆,其中包括:

  • F:车辆前进到下一个方块。
  • R:车辆向右转90度(不能再移动)。
  • L:车辆在原处向左转90度(不再移动)。

给出指示后,您可以按“ GO”按钮并将车辆发送到指定位置,因为它将按照给定顺序遵循每个指示。因此,您可以告诉孩子插入车辆所需的说明,以转到给定的字母。

您必须编写最短的程序/函数来处理string带有一组指令的(输入参数)并计算车辆停靠的字母(输出string)。

细节:

  • 车辆始终从底部的空白方块开始,面向北(朝向U方块)。
  • 输入字符串将只包含字母FRLG(对于“走出去”按钮)。如果您愿意,可以在垫子和说明中使用小写字母。
  • 该算法必须服从第一个指令之前的字符串中的G每个指令(之后的每个指令都将随着车辆开始移动而被忽略)。
  • 如果车辆在任何给定时刻离开垫子(即使输入字符串尚未完全处理),算法也必须返回字符串Out of mat
  • 如果不是,则算法必须返回车辆已停止的字母。起点计为一个字符(或一个空字符串)。

例子:

Input: FFG
Output: P

Input: FRFRFG
Output: Out of mat

Input: RRFFG
Output: Out of mat

Input: FFFRFFLFG
Output: X

Input: FFFRFFLF
Output:      <-- Nothing or a whitespace (the robot has not started moving)

Input: FFFRRFFFG
Output:      <-- Nothing or a whitespace (the robot has returned to the starting point)

Input: RRRRRLFFFLFFRFRFGFFRRGRFF
Output: L    (Everything after the first G is ignored)

这是,所以每种语言的最短程序可能会赢!


1
接下来:相同的东西,但是使用mat配置作为字符串输入,@起始位置和空格不在mat上,因此此配置将是ERLBIXN\nOAQYCTG\nFWHPDZS\n KVUMJ \n @(具有不同的间距,SE将其弄乱了)
Stephen

Answers:


3

的JavaScript(ES6),194个 176 169 163字节

感谢@Luke和@Arnauld,节省了一些字节。

s=>(p=35,d=3,t='ERLBIXN1OAQYCTG1FWHPDZS11KVUMJ11111 11',[...s].every(i=>i=='L'?d--:i>'Q'?d++:i<'G'?+t[p+=[1,8,-1,-8][d%4]]||!t[p]?p=1/0:p:0)?'':t[p]||'Out of mat')

取消高尔夫:

s=>(
  p=35,
  d=3,
  t='ERLBIXN1OAQYCTG1FWHPDZS11KVUMJ11111 11',
  [...s].every(i=>i=='L'?d--:
                  i<'Q'?d++:
                  i<'G'?+t[p+=[1,8,-1,-8][d%4]]||!t[p]?p=1/0:p:
                  0
              )?'':
               t[p]||'Out of mat'
)

f=
s=>(p=35,d=3,t='ERLBIXN1OAQYCTG1FWHPDZS11KVUMJ11111 11',[...s].every(i=>i=='L'?d--:i>'Q'?d++:i<'G'?+t[p+=[1,8,-1,-8][d%4]]||!t[p]?p=1/0:p:0)?'':t[p]||'Out of mat')

console.log(f('FFG')); //P
console.log(f('FRFRFG')); //Out of mat
console.log(f('RRFFG')); //Out of mat
console.log(f('FFFRFFLFG')); //X
console.log(f('FFFRFFLF')); //(space)
console.log(f('FFFRRFFFG')); //(space)
console.log(f('RRRRRLFFFLFFRFRFGFFRRGRFF')); //L
console.log(f('FFFFFRRFG')); //Out of mat


1
您可以通过更换节省3个字节false!1
卢克

谢谢,@ Luke。实际上,通过完全删除“ G”测试,我可以节省很多字节。如果不是“ L”,“ R”或“ F”,则可以假定为“ G”(除非缺少“ G”)。无论哪种方式,该every方法都可以处理它。
里克·希区柯克,

这是165个字节的解决方案:(s,p=35,d=3,t='ERLBIXN1OAQYCTG1FWHPDZS11KVUMJ11111 11')=>[...s].every(i=>i=='L'?d--:i=='R'?d++:i=='F'?+t[p+=[1,8,-1,-8][d%4]]||!t[p]?p=1/0:1:0)?'':t[p]||'Out of mat'
路加福音

不知道怎么使我达到165个字节(?),但是我当然不需要为[1,8,-1,-8]数组分配单独的变量,谢谢!
里克·希区柯克

糟糕,应该算错了,是171。我还删除了一个不需要的空格,该空格仍在当前答案中(这是最后一个空格)。
路加福音

2

Python 2,235字节

x=0;y=1;a=4;b=3
p='ERLBIXN','OAQYCTG','FWHPDZS','aKVUMJ','aaa '
r=''
for i in input():
 if'G'==i:r=p[a][b];break
 elif'G'>i:
  b+=x;a-=y;
  if(-1<a<5)-1or(''<p[a][b:]<'a')-1:r='Out of mat';break
 else:x,y=[[y,-x],[-y,x]][i<'R']
print r

在线尝试!


2

Python 3中226个 231 241字节

第二次编辑;应该现在工作。同样,要进行大量优化。

n=input();s="0ERLBIXN00OAQYCTG00FWHPDZS000KVUMJ000000 00000";d=1;c=40;i=0;w=[-1,-9,1,9]
while n[i]!="G"and c>=0:
 if n[i]=="F":c+=w[d]
 else:d=[d+[-1,3][d<0],-~d%4][n[i]=="R"]
 i+=1
print(["Out of mat",s[c]][c in range(len(s))and s[c]!="0"])

在线尝试!


0

Wolfram语言 / Mathematica,300字节

p=Re[(1-7I)#[[1]]]&;d=Drop;t=Throw;s=Switch;s[#,0,"Out of mat",_,StringPart["000 0000KVUMJ0FWHPDZSOAQYCTGERLBIXN",p@#]]&@Catch@Fold[If[MemberQ[d[d[Range[4,35],{2,5}],{7}],p@#],#,t@0]&@(s[#2,"F",#+{#[[2]],0},"R",#{1,-I},"L",#{1,I},_,t[#]]&)[#1,#2]&,{4,I},If[StringFreeQ["G"]@#,{"G"},Characters@#]&@#]&

取消高尔夫:

p = Re[(1 - 7 I) #[[1]]] &;
d = Drop;
t = Throw;
s = Switch;
s[#,
    0, "Out of mat",
    _, StringPart["000 0000KVUMJ0FWHPDZSOAQYCTGERLBIXN", p@#]] &@
  Catch@
  Fold[
    If[MemberQ[d[d[Range[4, 35], {2, 5}], {7}], p@#], #, 
        t@0] &@(s[#2, "F", # + {#[[2]], 0}, "R", # {1, -I}, 
          "L", # {1, I}, _, t[#]] &)[#1, #2] &,
    {4, I},
    If[StringFreeQ["G"]@#, {"G"}, Characters@#] &@#] &
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.