子供向けロボットで遊ぶ-どの手紙に届きますか?


12

TL; DR:文字の配列と配列の開始位置にあるロボットを指定して、動きのある文字列を読み取ることができるアルゴリズムを書きます(F「進む」、R「右に90度回転する」、「90度L回転する」左」)、ロボットの終了位置を計算します。全文の詳細。

自宅には子供向けの非常にシンプルなプログラム可能なデバイスがあります。ボタンで車両を前進させたり、左に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 |   
    +---+---+---+---+---+
            |   |
            +---+

また、「前進」コマンドをプログラムするときに車両がマットの1正方形のサイズだけ正確に前進するように車両を変更したとします。そのため、車両がU広場にあり北に行く場合、車両は広場で正確に停止しPます。

指示はすべて、移動を開始する前に車両に与えられ、次のとおりです。

  • F:車両は次の広場に進みます。
  • R:車両はその場所で90度右に曲がります(それ以上は動きません)。
  • L:車両はその場所で左に90度回転します(それ以上の移動はありません)。

指示が与えられたら、「GO」ボタンを押して、指定された順序ですべての指示に従うため、車両を指定された位置に送信できます。だから、あなたは子供が与えられた手紙に行くために車両に必要な指示を挿入するように伝えることができます。

string(入力パラメーター)を一連の指示で処理し、車両が停止する文字(出力string)を計算する最短のプログラム/関数を作成する必要があります。

詳細:

  • 車両は常に、一番下の空白の正方形から始まり、北を向いています(U正方形に向かって)。
  • 入力文字列は、文字のみが含まれますFRLG(「GO」ボタンのため)。必要に応じて、マットと手順に小文字を使用できます。
  • アルゴリズムは、文字列内の最初のG命令の前にすべての命令に従う必要があります(車両が移動を開始したため、その後の命令はすべて無視されます)。
  • 車両が特定の瞬間にマットから出た場合(入力文字列が完全に処理されていない場合でも)、アルゴリズムはstringを返す必要がありますOut of mat
  • そうでない場合、アルゴリズムは車両が停止した手紙を返さなければなりません。開始点は、char(または空の文字列)としてカウントされます。

例:

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
次は:同じことが、マットの構成の文字列を入力として、と@マットオフである開始位置とスペースであり、この設定は次のようになりますので、ERLBIXN\nOAQYCTG\nFWHPDZS\n KVUMJ \n @(異なる間隔で、SEはそれを台無し)
スティーブン

回答:


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
ルカ

ありがとう、@ルーク。実際に「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の3226の 231 241バイト

2番目の編集。今すぐ動作するはずです。繰り返しますが、多くの最適化が行われます。

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@#] &@#] &
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.