아이들을 위해 로봇을 가지고 놀기-어떤 편지를받을 수 있습니까?


12

TL; DR : 배열의 시작 위치에 문자 배열과 로봇이 주어지면 움직임이있는 문자열을 읽을 수있는 것보다 알고리즘을 작성하십시오 ( F"앞으로 이동", R"90도 오른쪽으로 회전"및 L"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 |   
    +---+---+---+---+---+
            |   |
            +---+

"앞으로 이동"명령을 프로그래밍 할 때 차량이 매트에서 정확히 한 정사각형 크기로 진행되도록 차량을 수정했다고 가정 해 봅시다. 따라서 차량이 U정사각형에 있고 북쪽으로 가면 P정사각형에 정확하게 멈 춥니 다 .

지시 사항은 차량이 움직이기 전에 차량에 제공되며 다음과 같습니다.

  • F: 차량이 다음 광장으로갑니다.
  • R: 차량이 그 자리에서 오른쪽으로 90도 회전합니다 (추가 이동 없음).
  • L: 차량이 그 자리에서 왼쪽으로 90도 회전합니다 (추가 이동 없음).

지시 사항이 제시되면 "GO"버튼을 누르고 주어진 순서대로 모든 지시 사항을 따르므로 차량을 주어진 위치로 보낼 수 있습니다. 따라서 차량에 지정된 지시 사항으로 이동하는 데 필요한 지시 사항을 삽입하도록 아이에게 지시 할 수 있습니다.

string일련의 명령 으로 (입력 매개 변수) 를 처리 하고 차량이 정지하는 문자를 계산 하는 가장 짧은 프로그램 / 기능을 작성해야합니다 (출력 string).

세부:

  • 차량은 항상 하단의 빈 사각형에서 시작하여 북쪽을 향합니다 ( U정사각형 쪽으로 ).
  • 입력 문자열은 문자 포함 F, R, LG(이하 "이동"버튼을). 원하는 경우 매트와 지침에 소문자를 사용할 수 있습니다.
  • 알고리즘은 첫 번째 문자열 이전에 문자열의 모든 명령을 따라야합니다 G(차량이 이동하기 시작한 이후의 모든 명령은 무시 됨).
  • 입력 문자열이 완전히 처리되지 않은 경우라도 차량이 매트에서 나오면 알고리즘은 문자열을 반환해야합니다 Out of mat.
  • 그렇지 않은 경우 알고리즘은 차량이 정지 한 문자를 반환해야합니다. 시작점은 문자 (또는 빈 문자열) 로 계산됩니다 .

예 :

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가 엉망이 됨)
Stephen

답변:


3

자바 스크립트 (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
false!1
Luke

감사합니다, @Luke. "G"테스트를 모두 제거하여 실제로 많은 바이트를 절약 할 수 있습니다. "L", "R"또는 "F"가 아닌 경우 "G"가없는 경우 "G"로 가정 할 수 있습니다. 어느 쪽이든, every방법은 그것을 처리합니다.
Rick Hitchcock

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

그것이 어떻게 165 바이트 ()에 도달하는지 잘 모르지만 [1,8,-1,-8]배열에 별도의 변수가 필요하지 않습니다 . 감사합니다!
Rick Hitchcock

죄송합니다. 잘못 계산 했어야합니다. 171입니다. 또한 필요하지 않은 공간을 제거했습니다.이 공간은 현재 답변에 있습니다 (마지막 공간 임).
Luke

2

파이썬 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

파이썬 (3) , 226 (231) 241 바이트

두 번째 편집; 지금 작동합니다. 다시, 많은 최적화가 수행되어야합니다.

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

볼프람 언어 / 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.