직사각형 잔디 깍기


17

잔디밭은 보이는 공백의 두 레이어로 둘러싸인 하나의 문자가있는 직사각형 필드로 정의됩니다 . 이것은 위의 두 줄과 아래의 두 줄을 의미하고 왼쪽에 두 개의 공백 패딩을 의미합니다 (오른쪽에 공백이 표시되므로 포함하지 않아도 됨).

  
  
  ||||| 
  ||||| 
  ||||| 
 
  

잔디를 깎은 잔디밭은 주인공이 첫 번째 캐릭터의 단축 버전이라는 점을 제외하고 비슷한 구조입니다.

  
  
  ..... 
  ..... 
  ..... 
 
  

모어는 잔디밭 캐릭터와는 다른 두 가지 캐릭터입니다. 다음은 =모어의 후면과 o전면의 예입니다.

=o

모어는 잔디밭을 세로로 움직이며 앞면에서 회전 할 수도 있습니다. 위의 모어는 애니메이션의 특정 지점에서 다음과 같이 보일 수 있습니다.

=o 
  
o= 
  
o
=
  
=
o

모어는 아래 잔디밭의 아래 위치 중 어느 곳에서나 시작할 수 있습니다. 로 깍은 o잔디를 시계 방향으로 돌아 다니는 것입니다. 로 깍은 0잔디 반을 돌아 다니는 것입니다.

  =   =
  0   o
=o|||||0=
  ||||| 
=0|||||o=
  o   0
  =   =

애니메이션은 두 번째 0에서 시작합니다. 1 초마다 모어가 한 칸 앞으로 이동하고 잔디를 앞면에서 자릅니다. 모어가 스팟을 비우면 잘립니다. 모어 전면이 라인의 마지막 미 절삭 품목에 도달하고 여전히 미 절단 잔디가있는 경우, 현재 모어를 계속하기 위해 모어가 다시 한 번 회전합니다 (원래 위치를 기준으로 시계 방향 / 반 시계 방향으로 유지). 잔디밭에서 완전히 떨어질 때까지 똑바로 계속갑니다 (이미 잔디 깎기).

왼쪽 상단에서 모어가 시작되면 5x3 잔디밭의 기본 진행 상태가 표시됩니다.

Second 0  Second 1  Second 2  Second 3  Second 4  Second 5  Second 6  Second 7  Second 8  Second 9  Second 10 Second 11 Second 12 Second 13 Second 14 Second 15 Second 16 Second 17 Second 18 Second 19 Second 20 Second 21 Second 22

                                                                  =
=o|||||    =o||||     =o|||     .=o||     ..=o|     ...=o     ....o     ....=     .....     .....     .....     .....     .....     .....     .....     .....     .....     .....     .....     .....     .....     .....     .....
  |||||     |||||     |||||     |||||     |||||     |||||     |||||     ||||o     ||||=     ||||.     ||||.     ||||.     ||||.     ||||.     ||||.     o|||.    =o|||.     =o||.     .=o|.     ..=o.     ...=o     ....=o    .....=o
  |||||     |||||     |||||     |||||     |||||     |||||     |||||     |||||     ||||o     ||||o=    |||o=     ||o=.     |o=..     o=...     o....     =....     .....     .....     .....     .....     .....     .....     .....
                                                                                                                                              =
  

입력

입력 내용은 잔디밭의 크기입니다 (2 개의 정수).

산출

잔디밭과 모어를 원하는 위치에 인쇄하십시오. 잔디, 잔디 자르기, 잔디 깎기 앞면 및 잔디 깎기의 네 문자를 선택할 수 있습니다. 현재 초의 내용을 사양에 표시하기에 충분한 공백이 필요하지만 추가 공백은 동일하게 보이는 한 완전히 허용됩니다.

이것은 이므로 초당 출력을 지우거나보기 프레임에서 애니메이션을 표시하기에 충분한 줄 바꿈을 인쇄 할 수 있습니다 (보기 프레임이 애니메이션으로 표시하는 데 필요한 크기라고 가정 할 수 있음).

1 초 이외의 일관된 시간 간격이 허용되지만 (즉, 어떤 이유로 999 바이트가 바이트를 저장하거나 2 초를 절약하는 경우) 잔디 깎는 기계가 여전히 자연스럽게 움직이는 것처럼 보입니다.

가능하면 비주얼 (TIO, Snippet, GIF 등)을 제공하십시오.

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.


3
좋은 도전! 전선에 짜증이
나는

출력 창이 잔디밭에 맞게 크기가 정해져 있다고 가정해도됩니까?
Adám

허용하려는 다른 것은 예제 실행과 비슷한 모든 상태 목록을 반환하는 것입니다.
Adám

3
잔디밭을 올바르게 깎고 싶다면 어떻게해야합니까? s-media-cache-ak0.pinimg.com/736x/92/5c/7c/…
tuskiomi

3
@tuskiomi 나는 같은 아이디어를 기반으로 한 작품에서 또 다른 도전을 받았지만 프로그래머가 잔디를 깎는 방법을 제어 할 수있는 곳 :)
Stephen

답변:


4

자바 스크립트 (ES6 / Node.js를) 664 개 525 523 문자

f=(w,h)=>{Z=require('sleep');c=a=>console.log(a);X=1;Y=2;D='e';N='|';O={'|':[0,-1],'e':[1,0],'s':[0,1],'w':[-1,0]};S=[N,D,'s','w'];q=d=>F[Y+O[d][1]][X+O[d][0]];b=' '.repeat(w+4),U='  ';F=[b,b].concat([...Array(h)].map(x=>U+N.repeat(w)+U)).concat([b,b]).map(x=>x.split``);for(;;){f=F.map(a=>a.concat());f[Y][X]='@';d=O[D];f[Y-d[1]][X-d[0]]='=';c(f.map(x=>x.join``).join`\n`);if(F[Y][X]==N)F[Y][X]='.';d=O[D],f=q(D),R=S[(S.indexOf(D)+1)%4],r=q(R);(r==N)&&((f==' ')||(f=='.'))?D=R:(X+=d[0],Y+=d[1])
Z.msleep(1E3);c('\033[2J')}}

의견으로 축소되지 않은 내용 :

f=(w,h)=>{
  Z = require('sleep');
  c=a=>console.log(a); 
  //mower coordinates
  X = 1;
  Y = 2;
  //mower direction
  D='e'; //n/e/s/w
  N='|';
  //directions with amount of change in [x,y] coordinates
  O = {'|':[0,-1],'e':[1,0],'s':[0,1],'w':[-1,0]};
  //direction short names
  S=[N,D,'s','w'];
  //query for item in specified direction relative to mower
  q=d=>F[Y+O[d][1]][X+O[d][0]];
 //generate field + whitespace
 b=' '.repeat(w+4),U='  ';
 F=[b,b].concat([...Array(h)].map(x=>U+N.repeat(w)+U)).concat([b,b]).map(x=>x.split``);
 for(;;){
    //print the field: 
    //make a copy of the field, so we can paste the mower on top of it
    f=F.map(a=>a.concat());
    //print mower head
    f[Y][X]='@';
    //print mower tail
    d = O[D];
    f[Y-d[1]][X-d[0]]='=';
    c(f.map(x=>x.join``).join`\n`);   
    //-----
    //move the mower
    if(F[Y][X]==N)F[Y][X]='.';//cut the grass if we stand on some
    d=O[D],//how many fields to move forward
        f=q(D),//item in front of mower
        R=S[(S.indexOf(D)+1)%4],//name of direction if we rotate to the right
        r=q(R);//item to right of mower
    //if there is wall in front of me OR cut grass in front of me and uncut on the right, turn right, else go ahead
    (r==N) && ((f==' ') || (f=='.'))?D=R:(X+=d[0],Y+=d[1])
    Z.msleep(1E3);
    c('\033[2J');
};
}
//test script
f(3,3);

참고 : 'sleep'패키지를 가져 와서 setTimeout으로 다시 작성하여 nodejs와 독립적이어야한다고 가정합니다.


나는 이것을 TIO에 붙이려 고 시도했다 (노드 .js에서 작동한다고 말한다). 왜 작동하지 않는 단서가 있습니까?
Stephen

'수면'모듈 때문에
Axarydax
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.