Zabawa robotami dla dzieci - do której litery dotrę?

12

TL; DR: Biorąc pod uwagę tablicę znaków i robota w początkowej pozycji tablicy, napisz algorytm niż można odczytać ciąg znaków z ruchami ( Fdla „idź do przodu”, Rdla „obróć o 90 stopni w prawo” i Ldla „obróć o 90 stopni left ”) i obliczyć pozycję końcową robota. Więcej szczegółów w pełnym tekście.

Mamy w domu bardzo proste programowalne urządzenie dla dzieci: mały pojazd z przyciskami do jazdy do przodu, skrętu o 90 stopni w lewo lub o 90 stopni w prawo. Coś podobnego do tego:

Pojazd myszy

Mamy również piankową matę z takimi literami:

Mata do gry

Wszystko to ma na celu nauczyć dzieci alfabetu i podstaw programowania jednocześnie.

Wyzwanie

Załóżmy, że losowo ułożyliśmy naszą matę piankową w następujący sposób:

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

Załóżmy również, że zmodyfikowaliśmy pojazd, aby podczas programowania polecenia „iść do przodu” pojazd poruszał się do przodu dokładnie o rozmiar jednego kwadratu na macie. Tak więc, jeśli pojazd znajduje się na Uplacu i jedzie na północ, zatrzymuje się dokładnie na Pplacu.

Wszystkie instrukcje są przekazywane pojazdowi, zanim zacznie się on poruszać, a są to:

  • F: Pojazd jedzie do następnego kwadratu.
  • R: Pojazd obraca się o 90 stopni w prawo na swoim miejscu (bez dalszego ruchu).
  • L: Pojazd obraca się o 90 stopni w lewo na swoim miejscu (bez dalszego ruchu).

Po wydaniu instrukcji można nacisnąć przycisk „GO” i wysłać pojazd na określoną pozycję, ponieważ będzie on postępować zgodnie z każdą instrukcją w podanej kolejności. Możesz więc powiedzieć dziecku, aby wstawiło potrzebne instrukcje dla pojazdu, aby przejść do danej litery.

Musisz napisać najkrótszy program / funkcję, która przetwarza string(parametr wejściowy) z zestawem instrukcji i oblicza literę zatrzymania pojazdu (wynik string).

Detale:

  • Pojazd zawsze zaczyna się od pustego kwadratu na dole i jest skierowany na północ (w kierunku Ukwadratu).
  • Ciąg wejściowy będzie zawierać tylko litery F, R, Loraz G(za pomocą przycisku „Go”). Możesz użyć małych liter dla maty i instrukcji, jeśli wolisz.
  • Algorytm musi być zgodny z każdą instrukcją w ciągu przed pierwszą G(każda następna instrukcja jest ignorowana, gdy pojazd ruszy).
  • Jeśli pojazd wyjdzie z maty w danym momencie (nawet jeśli łańcuch wejściowy nie został całkowicie przetworzony), algorytm musi zwrócić łańcuch Out of mat.
  • Jeśli nie, algorytm musi zwrócić literę, w której zatrzymał się pojazd. Punkt początkowy liczy się jako znak (lub pusty ciąg).

Przykłady:

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)

To jest , więc może wygrać najkrótszy program dla każdego języka!

Charlie
źródło
1
Dalej: to samo, ale z konfiguracją maty jako wejściem łańcuchowym, z @pozycją początkową i spacjami poza matą, więc ta konfiguracja byłaby ERLBIXN\nOAQYCTG\nFWHPDZS\n KVUMJ \n @(przy różnych odstępach, SE pomieszała)
Stephen

Odpowiedzi:

3

JavaScript (ES6), 194 176 169 163 bajtów

Oszczędność niektórych bajtów dzięki @Luke i @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')

Nie golfowany:

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

Rick Hitchcock
źródło
1
Można zapisać 3 bajty zastępując falsez!1
Łk
Dzięki, @Luke. Naprawdę mogę zapisać kilka bajtów, całkowicie usuwając test „G”. Jeśli nie jest to „L”, „R” lub „F”, można założyć, że jest to „G” (chyba że brakuje „G”). Tak czy inaczej, everymetoda to obsługuje.
Rick Hitchcock,
Oto rozwiązanie dla 165 bajtów:(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
Nie jestem pewien, jak to mnie prowadzi do 165 bajtów (?) Ale z pewnością nie potrzebuję osobnej zmiennej dla [1,8,-1,-8]tablicy, dzięki!
Rick Hitchcock
Ups, musiałem przeliczyć, to jest 171. Usunąłem również niepotrzebne miejsce, które wciąż znajduje się w bieżącej odpowiedzi (jest to ostatnie miejsce).
Łukasz
2

Python 2 , 235 bajtów

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

Wypróbuj online!

ovs
źródło
2

Python 3 , 226 231 241 bajtów

Druga edycja; powinien działać teraz. Znowu mnóstwo optymalizacji do zrobienia.

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

Wypróbuj online!

Fedone
źródło
0

Wolfram Language / Mathematica, 300 bajtów

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

Nie golfowany:

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@#] &@#] &
chuy
źródło