Çocuklar için robotlarla oynamak - Hangi mektuba ulaşacağım?


12

TL; DR: Dizinin başlangıç ​​konumunda bir dizi karakter ve bir robot verildiğinde, hareketleri olan bir dizeyi okuyabileceğinden ( F"ileri git", R"90 derece sağa döndür" ve L"90 derece döndür ") bir algoritma yazın sola ") gidin ve robotun bitiş konumunu hesaplayın. Metnin tamamında daha fazla ayrıntı.

Evde çocuklar için çok basit bir programlanabilir cihazımız var: aracın ilerlemesini, 90 derece sola dönmesini veya 90 derece sağa dönmesini sağlayan düğmeli küçük bir araç. Buna benzer bir şey:

Fare aracı

Ayrıca böyle harflerle bir köpük paspasımız var:

Oyun minderi

Tüm bunların amacı, çocuklara aynı anda hem alfabeyi hem de programlama ilkelerini öğretmektir.

Meydan okuma

Köpük matımızı rastgele şu şekilde düzenlediğimizi varsayalım:

+---+---+---+---+---+---+---+
| 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 |   
    +---+---+---+---+---+
            |   |
            +---+

Ayrıca, bir "ileri git" komutunu programladığımızda, araç paspastaki bir karenin boyutunun tam olarak ilerleyeceği şekilde aracı değiştirdiğimizi varsayalım. Yani, araç Umeydanda ise ve kuzeye giderse, tam olarak Pmeydanda durur .

Talimatlar, hareket etmeye başlamadan önce araca verilir ve bunlar:

  • F: Araç bir sonraki meydana geçer.
  • R: Araç yerine 90 derece sağa döner (başka hareket olmaz).
  • L: Araç yerinde 90 derece sola döner (başka hareket olmaz).

Talimatlar verildiğinde, "DEVAM" düğmesine basabilir ve aracı verilen sıradaki tüm talimatları izleyeceği için belirli bir konuma gönderebilirsiniz. Böylece, çocuğa aracın belirli bir harfe gitmesi için gerekli talimatları eklemesini söyleyebilirsiniz.

Bir string(giriş parametresi) bir dizi talimatla işleyen ve aracın durduğu harfi (çıkış string) hesaplayan en kısa programı / işlevi yazmalısınız .

Detaylar:

  • Araç her zaman alttaki boş karede başlar ve kuzeye bakar ( Ukareye doğru ).
  • Girdi dizesi sadece harf içerecektir F, R, Lve G( "git" düğmesi için). İsterseniz paspas için küçük harfler ve talimatlar kullanabilirsiniz.
  • Algoritma ilk önce dizgideki her talimata uymalıdır G(bundan sonra her hareket, araç hareket etmeye başladığında yok sayılır).
  • Araç herhangi bir anda paspastan çıkarsa (giriş dizesi tamamen işlenmemiş olsa bile), algoritma dizeyi döndürmelidir Out of mat.
  • Değilse, algoritma aracın durduğu harfi döndürmelidir. Başlangıç ​​noktası karakter (veya boş bir dize) olarak sayılır .

Örnekler:

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)

Bu , bu yüzden her dil için en kısa program kazanabilir!


1
Sıradaki: aynı şey, ancak dize girişi olarak mat konfigürasyonu ile @, başlangıç ​​pozisyonu ve boşlukların mattan çıkmasıyla, bu konfigürasyon ERLBIXN\nOAQYCTG\nFWHPDZS\n KVUMJ \n @(farklı aralıklarla, SE berbat etti)
Stephen

Yanıtlar:


3

JavaScript (ES6), 194 176 169 163 bayt

@Luke ve @Arnauld sayesinde bazı baytlar kaydetti.

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')

Ungolfed:

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
Sen değiştirerek 3 bayt kaydedebilirsiniz falseile!1
Luke

Teşekkürler, @ Luke. Aslında bir sürü baytı "G" testini tamamen kaldırarak kaydedebilirim. "L", "R" veya "F" değilse, "G" olduğu varsayılabilir ("G" eksik değilse). Her iki durumda da, everyyöntem bunu ele alır.
Rick Hitchcock

İşte 165 bayt için bir çözüm:(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'
Luke

Bu nasıl beni 165 bayt (?) Alır emin değilim Ama kesinlikle [1,8,-1,-8]dizi için ayrı bir değişken gerekmez , teşekkürler!
Rick Hitchcock

Hata! Yanlış saymış olmalıydı, 171. Ayrıca ihtiyacınız olmayan bir alanı da kaldırdım, ki bu hala geçerli cevapta (son boşluk).
Luke

2

Python 2 , 235 bayt

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

Çevrimiçi deneyin!


2

Python 3 , 226 231 241 bayt

İkinci düzenleme; şimdi çalışmalı. Yine, bol miktarda optimizasyon yapılacak.

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"])

Çevrimiçi deneyin!


0

Wolfram Dili / Mathematica, 300 Bayt

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@#]&@#]&

Ungolfed:

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@#] &@#] &
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.