修剪矩形草坪


17

草坪被定义为一个矩形区域,其中一个字符被两层可见空白包围。这意味着上方有两行,下方有两行,并且左侧有两个空格填充(右侧具有可见的空格,因此您无需将其包括在内)。

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

修剪过的草坪具有类似的结构,除了主要角色是第一个角色的简化版本。

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

割草机是两个不同的角色,与两个草坪角色不同。这是一个例子,=作为割草机的后面和o前面:

=o

割草机将在草坪上垂直移动,也可以在草坪的前面旋转。在动画中的某些时候,上面的割草机可能看起来像下面的任何割草机:

=o 
  
o= 
  
o
=
  
=
o

割草机可以在下面的草坪上的以下任何位置上启动。割草机o将顺时针绕草坪行驶。割草机0将逆时针绕草坪行驶。

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

动画从第二个0开始。割草机每秒钟向前移动一个空间,并在其前面割草。当割草机腾出一个点时,它似乎被割断了。当割草机的前部到达生产线上的最后一个未切割的物品时(仍然有未割的草),割草机的后部旋转一次,以继续当前的割草(基于原始位置顺时针/逆时针停留)当割草机完成后,它继续笔直(修剪已经割好的草),直到完全离开草坪。

从左上角开始有割草机,这显示了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....     =....     .....     .....     .....     .....     .....     .....     .....
                                                                                                                                              =
  

输入项

您的输入将是草坪的尺寸(两个整数)。

输出量

在您选择的位置打印草坪和割草机。您可以为草皮,割草,割草机正面和割草机背面选择四个字符。您只需要足够的空格来显示当前秒的内容到规格,但是完全可以允许额外的空格,只要它看起来相同即可。

由于这是,因此您可以每秒清除输出,或者打印足够的换行符以显示在查看框中进行动画处理(您可以假定查看框是显示动画所需的尺寸)。

允许使用除一秒以外的一致时间间隔(例如,出于某种原因,可以节省999毫秒或两秒),但是应该使割草机看起来仍在自然移动。

尽可能提供视觉效果(TIO,代码段,GIF等)

这是,因此最短答案以字节为单位。


3
好挑战!从一个被电线烦恼的人的角度来讲,您可能最终会
割伤

我们可以假设输出窗口的大小适合草坪吗?
阿达姆(Adám)'17

您可能要允许的其他事情是返回所有状态的列表,类似于您的示例运行。
阿达姆(Adám)'17年

3
如果我们想以正确的方式修剪草坪怎么办?s-media-cache-ak0.pinimg.com/736x/92/5c/7c/…–
tuskiomi

3
@tuskiomi基于相同的想法,我在工作中遇到了另一个挑战,但是程序员可以控制它的修剪方式:)
Stephen

Answers:


4

JavaScript的(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中(它说它适用于node.js)。任何线索为什么它不起作用?
斯蒂芬

因为“睡眠”模块的-我会摆脱它
Axarydax
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.