長方形の芝生を刈る


17

芝生は、1つの文字が2層の表示可能な空白で囲まれた長方形のフィールドとして定義されます。これは、上の2行と下の2行、および左側の2つのスペースのパディングを意味します(右側には目に見える空白があるので、含める必要はありません)。

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

刈られた芝生も同様の構造です。ただし、メインキャラクターは最初のキャラクターの短縮バージョンです。

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

芝刈り機は、2つの芝生のキャラクターとは異なる2つの異なるキャラクターです。=芝刈り機の背面およびo前面としての例を次に示します。

=o

芝刈り機は芝生の周りを垂直に動き、正面で回転することもできます。上記の芝刈り機は、アニメーションのある時点で以下のいずれかになります。

=o 
  
o= 
  
o
=
  
=
o

芝刈り機は、下の芝生にある下の位置のセットで開始できます。芝刈り機はo、芝生を時計回りに回ります。芝刈り機0は芝生を反時計回りに回ります。

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

アニメーションは0秒から始まります。毎秒、芝刈り機は1スペース先に進み、その前で草を刈ります。芝刈り機がスポットを空けると、刈り取られたように見えます。芝刈り機の前部がライン上の最後の未切断アイテムに到達すると(そしてまだ刈り取られていない草がある場合)、芝刈り機の後部は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つの整数)になります。

出力

選択した位置に芝生と芝刈り機を印刷します。草、刈草、芝刈り機の前部、芝刈り機の4つのキャラクターを選択できます。現在の秒のコンテンツを仕様に表示するのに十分な空白だけが必要ですが、同じように見える限り、余分な空白は完全に許可されます。

これは、1秒ごとに出力をクリアするか、表示フレームでアニメーションを表示するのに十分な改行を印刷することができます(表示フレームは、アニメーション表示に必要なサイズであると想定できます)。

1秒以外の一定の時間間隔(つまり、1バイトを節約するために999ミリ秒、または何らかの理由で2秒)が許可されますが、芝刈り機が自然に動いているように見えるはずです。

可能であれば、ビジュアル(TIO、スニペット、GIFなど)を提供します

これはであるため、バイト単位の最短回答が優先されます。


3
ナイスチャレンジ!ワイヤーに悩まされている人の観点から言えば、おそらくワイヤーの上で草刈りをしてしまうでしょう:)
HyperNeutrino

出力ウィンドウのサイズが芝生に合うと仮定できますか?
アダム

他に許可したいのは、実行例と同様に、すべての状態のリストを返すことです。
アダム

3
芝生を正しい方法で刈り取りたい場合はどうしますか?s-media-cache-ak0.pinimg.com/736x/92/5c/7c/...
tuskiomi

3
@tuskiomi同じアイデアに基づいて作品に別の課題がありますが、プログラマーはそれがどのように刈られるかを制御できます:)
スティーブン

回答:


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」パッケージを取得し、setjsを使用してnodejsに依存しないように書き換える必要があると思います


これをTIOに貼り付けてみました(node.jsで機能すると言われています)。それが機能しない理由の手がかりはありますか?
スティーブン

「スリープ」モジュールのため-私はそれを取り除く
-Axarydax
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.