Bermain dengan robot untuk anak-anak - Surat apa yang akan saya raih?

12

TL; DR: Diberikan array karakter dan robot dalam posisi awal array, tulis sebuah algoritma daripada membaca string dengan gerakan ( Funtuk "maju", Runtuk "putar 90 derajat ke kanan" dan Luntuk "putar 90 derajat kiri ") dan hitung posisi akhir robot. Lebih detail dalam teks lengkap.

Kami memiliki di rumah alat yang dapat diprogram sangat sederhana untuk anak-anak: kendaraan kecil dengan tombol untuk membuat kendaraan maju, belok kiri 90 derajat atau belok kanan 90 derajat. Sesuatu yang mirip dengan ini:

Kendaraan mouse

Kami juga memiliki tikar busa dengan huruf-huruf seperti ini:

Tikar bermain

Tujuan dari semua ini adalah untuk mengajarkan anak-anak baik alfabet dan dasar-dasar pemrograman, sekaligus.

Tantangan

Misalkan kita telah mengatur tikar busa kita secara acak seperti ini:

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

Misalkan kita telah memodifikasi kendaraan sehingga ketika kita memprogram perintah "maju", kendaraan berjalan persis berukuran satu kotak di matras. Jadi, jika kendaraan berada di Ualun - alun dan pergi ke utara, ia berhenti persis di Palun - alun.

Semua instruksi diberikan kepada kendaraan sebelum mulai bergerak, dan itu adalah:

  • F: Kendaraan berjalan maju ke alun-alun berikutnya.
  • R: Kendaraan berbelok 90 derajat tepat di tempatnya (tidak ada gerakan lebih lanjut).
  • L: Kendaraan membelok 90 derajat ke kiri pada tempatnya (tidak ada gerakan lebih lanjut).

Setelah instruksi diberikan, Anda dapat menekan tombol "GO" dan mengirim kendaraan ke posisi tertentu karena akan mengikuti setiap instruksi dalam urutan yang diberikan. Jadi, Anda dapat memberi tahu anak itu untuk memasukkan instruksi yang diperlukan agar kendaraan tersebut pergi ke surat yang diberikan.

Anda harus menulis program / fungsi terpendek yang memproses a string(parameter input) dengan seperangkat instruksi dan menghitung huruf kendaraan berhenti (output string).

Detail:

  • Kendaraan selalu mulai di alun-alun kosong di bagian bawah, dan menghadap ke utara (menuju Ualun - alun).
  • Input string akan hanya berisi huruf F, R, Ldan G(untuk tombol "go"). Anda dapat menggunakan huruf kecil untuk matras dan instruksinya, jika Anda mau.
  • Algoritma harus mematuhi setiap instruksi dalam string sebelum yang pertama G(setiap instruksi setelah itu diabaikan karena kendaraan sudah mulai bergerak).
  • Jika kendaraan keluar dari mat pada saat tertentu (bahkan jika string input belum sepenuhnya diproses), algoritme harus mengembalikan string Out of mat.
  • Jika tidak, algoritme harus mengembalikan surat yang telah dihentikan kendaraan. Titik awal dihitung sebagai char (atau string kosong).

Contoh:

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)

Ini , jadi semoga program terpendek untuk setiap bahasa menang!

Charlie
sumber
1
Selanjutnya: hal yang sama, tetapi dengan konfigurasi mat sebagai input string, dengan @posisi awal dan spasi di mat, sehingga konfigurasi ini akan menjadi ERLBIXN\nOAQYCTG\nFWHPDZS\n KVUMJ \n @(dengan jarak yang berbeda, SE mengacaukannya)
Stephen

Jawaban:

3

JavaScript (ES6), 194 176 169 163 byte

Menyimpan beberapa byte berkat @Luke dan @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')

Tidak Disatukan:

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
sumber
1
Anda dapat menghemat 3 byte dengan menggantinya falsedengan!1
Luke
Terima kasih, Lukas. Saya benar-benar dapat menyimpan banyak byte dengan menghapus tes "G" sama sekali. Jika bukan "L", "R", atau "F" itu dapat dianggap sebagai "G" (kecuali jika "G" hilang). Either way, everymetode menanganinya.
Rick Hitchcock
Inilah solusi untuk 165 byte:(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
Tidak yakin bagaimana itu membuat saya menjadi 165 byte (?) Tapi saya tentu tidak perlu variabel terpisah untuk [1,8,-1,-8]array, terima kasih!
Rick Hitchcock
Ups, pasti salah hitung, ini 171. Saya juga menghapus spasi yang tidak Anda butuhkan, yang masih ada dalam jawaban saat ini (ini adalah ruang terakhir).
Luke
2

Python 2 , 235 byte

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

Cobalah online!

ovs
sumber
2

Python 3 , 226 231 241 byte

Sunting kedua; harus bekerja sekarang. Sekali lagi, banyak optimasi yang harus dilakukan.

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

Cobalah online!

Fedone
sumber
0

Bahasa Wolfram / Mathematica, 300 Bytes

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

Tidak Disatukan:

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
sumber