Chơi với robot cho trẻ em - Tôi sẽ đạt được lá thư nào?


12

TL; DR: Đưa ra một mảng ký tự và robot ở vị trí bắt đầu của mảng, viết một thuật toán có thể đọc một chuỗi bằng các chuyển động ( Fcho "đi tiếp", Rcho "xoay 90 độ sang phải" và Lcho "xoay 90 độ bên trái ") và tính toán vị trí kết thúc của robot. Thêm chi tiết trong văn bản đầy đủ.

Chúng tôi có ở nhà một thiết bị lập trình rất đơn giản cho trẻ em: một chiếc xe nhỏ có nút bấm để làm cho chiếc xe đi về phía trước, rẽ trái 90 độ hoặc rẽ phải 90 độ. Một cái gì đó tương tự như thế này:

Xe chuột

Chúng tôi cũng có một tấm thảm xốp với các chữ cái như thế này:

Chơi chiếu

Mục đích của tất cả những điều này là để dạy cho trẻ em cả bảng chữ cái và sự thô sơ của lập trình, tất cả cùng một lúc.

Các thách thức

Giả sử chúng ta đã sắp xếp ngẫu nhiên thảm xốp của chúng tôi như thế này:

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

Giả sử chúng ta cũng đã sửa đổi chiếc xe để khi chúng ta lập trình lệnh "đi tiếp", chiếc xe sẽ đi về phía trước chính xác kích thước của một hình vuông trong chiếu. Vì vậy, nếu chiếc xe ở trong Uquảng trường và đi về phía bắc, nó dừng lại chính xác trong Phình vuông.

Tất cả các hướng dẫn được đưa ra cho chiếc xe trước khi nó bắt đầu di chuyển, và đó là:

  • F: Xe đi tiếp vào quảng trường tiếp theo.
  • R: Xe quay 90 độ ngay tại vị trí của nó (không di chuyển thêm).
  • L: Xe quay trái 90 độ ở vị trí của nó (không di chuyển thêm).

Sau khi được hướng dẫn, bạn có thể nhấn nút "GO" và gửi xe đến một vị trí nhất định vì nó sẽ tuân theo mọi chỉ dẫn theo thứ tự nhất định. Vì vậy, bạn có thể bảo đứa trẻ chèn các hướng dẫn cần thiết cho chiếc xe để đi đến một lá thư nhất định.

Bạn phải viết chương trình / chức năng ngắn nhất xử lý một string(tham số đầu vào) với một bộ hướng dẫn và tính toán chữ cái mà xe dừng lại (đầu ra string).

Chi tiết:

  • Chiếc xe luôn bắt đầu ở ô vuông trống ở phía dưới, và hướng về phía bắc (về phía Uhình vuông).
  • Chuỗi đầu vào sẽ chỉ chứa các chữ cái F, R, LG(đối với nút "đi"). Bạn có thể sử dụng chữ cái viết thường cho chiếu và hướng dẫn, nếu bạn thích như vậy.
  • Thuật toán phải tuân theo mọi hướng dẫn trong chuỗi trước lần đầu tiên G(mọi hướng dẫn sau đó bị bỏ qua vì phương tiện đã bắt đầu di chuyển).
  • Nếu xe đi ra khỏi thảm tại bất kỳ thời điểm nào (ngay cả khi chuỗi đầu vào chưa được xử lý hoàn toàn), thuật toán phải trả về chuỗi Out of mat.
  • Nếu không, thuật toán phải trả lại chữ cái mà chiếc xe đã dừng lại. Điểm bắt đầu được tính là một char (hoặc một chuỗi rỗng).

Ví dụ:

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)

Đây là , vì vậy có thể chương trình ngắn nhất cho mỗi ngôn ngữ sẽ giành chiến thắng!


1
Tiếp theo: điều tương tự, nhưng với cấu hình mat là đầu vào chuỗi, với @vị trí bắt đầu và khoảng trắng nằm ngoài mat, vì vậy cấu hình này sẽ là ERLBIXN\nOAQYCTG\nFWHPDZS\n KVUMJ \n @(với các khoảng cách khác nhau, SE làm rối tung nó)
Stephen

Câu trả lời:


3

JavaScript (ES6), 194 176 169 163 byte

Đã lưu một số byte nhờ @Luke và @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')

Ung dung:

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
Bạn có thể lưu 3 byte bằng cách thay thế falsebằng!1
Luke

Cảm ơn, @Luke. Tôi thực sự có thể lưu một loạt các byte bằng cách loại bỏ hoàn toàn bài kiểm tra "G". Nếu không phải là "L", "R" hoặc "F" thì có thể được coi là "G" (trừ khi "G" bị thiếu). Dù bằng cách nào, everyphương thức xử lý nó.
Rick Hitchcock

Đây là giải pháp cho 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

Không chắc chắn làm thế nào điều đó đưa tôi đến 165 byte (?) Nhưng tôi chắc chắn không cần một biến riêng cho [1,8,-1,-8]mảng, cảm ơn!
Rick Hitchcock

Rất tiếc, phải bị nhầm lẫn, đó là 171. Tôi cũng đã xóa một khoảng trống bạn không cần, vẫn còn trong câu trả lời hiện tại (đó là không gian cuối cùng).
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

Hãy thử trực tuyến!


2

Trăn 3 , 226 231 241 byte

Chỉnh sửa lần thứ hai; nên làm việc bây giờ Một lần nữa, rất nhiều tối ưu hóa được thực hiện.

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

Hãy thử trực tuyến!


0

Ngôn ngữ Wolfram / Toán học, 300 byte

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

Ung dung:

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@#] &@#] &
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.