Mähen Sie einen rechteckigen Rasen

17

Ein Rasen ist ein rechteckiges Feld mit einem Zeichen, das von zwei sichtbaren Leerzeichen umgeben ist. Dies bedeutet zwei Zeilen oberhalb und zwei Zeilen unterhalb sowie zwei Leerzeichen links (rechts sind Leerzeichen sichtbar, sodass Sie sie nicht einschließen müssen).

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

Ein gemähter Rasen hat eine ähnliche Struktur, mit der Ausnahme, dass die Hauptfigur eine verkürzte Version der ersten Figur ist.

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

Ein Mäher besteht aus zwei verschiedenen Zeichen, die sich von den beiden Rasenzeichen unterscheiden. Hier ist ein Beispiel mit =als Rückseite des Mähers und oals Vorderseite:

=o

Ein Rasenmäher bewegt sich vertikal um den Rasen und kann sich auch an seiner Vorderseite drehen. Der oben abgebildete Rasenmäher kann zu einem bestimmten Zeitpunkt in der Animation wie der unten abgebildete aussehen:

=o 
  
o= 
  
o
=
  
=
o

Der Mäher kann auf einer der folgenden Positionen auf dem Rasen unter dem Rasen beginnen. Mäher mit owürden im Uhrzeigersinn um den Rasen fahren. Mäher mit 0würden gegen den Uhrzeigersinn um den Rasen fahren.

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

Die Animation beginnt bei Sekunde 0. Jede Sekunde bewegt sich der Mäher ein Feld vorwärts und schneidet das Gras an der Vorderseite. Wenn der Mäher eine Stelle verlässt, erscheint er geschnitten. Wenn die Mähervorderseite den letzten ungeschnittenen Gegenstand in einer Linie erreicht (und es gibt noch ungeschnittenes Gras), dreht sich der Mäherrücken einmal, um das aktuelle Mähen fortzusetzen (im Uhrzeigersinn / gegen den Uhrzeigersinn, basierend auf der ursprünglichen Position). Wenn der Mäher fertig ist, Es geht geradeaus weiter (mäht bereits geschnittenes Gras), bis es vollständig vom Rasen abfällt.

Mit einem Mäher, der oben links startet, wird der grundlegende Fortschritt für einen 5x3-Rasen angezeigt:

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....     =....     .....     .....     .....     .....     .....     .....     .....
                                                                                                                                              =
  

Eingang

Ihre Eingabe ist die Größe des Rasens (zwei ganze Zahlen).

Ausgabe

Drucken Sie den Rasen und den Rasenmäher in der von Ihnen gewählten Position. Sie können die vier Zeichen für Gras, Schnittgras, Mäherfront und Mäherrückseite auswählen. Sie brauchen nur genügend Leerzeichen, um den Inhalt der aktuellen Sekunde gemäß den Spezifikationen anzuzeigen, aber zusätzliches Leerzeichen ist vollständig zulässig, solange es gleich aussieht.

Da es sich um eine , können Sie entweder die Ausgabe jede Sekunde löschen oder genügend Zeilenumbrüche drucken, um im Ansichtsrahmen animiert zu werden (Sie können davon ausgehen, dass der Ansichtsrahmen die Größe hat, die zum Animieren erforderlich ist).

Ein anderes konsistentes Zeitintervall als eine Sekunde ist zulässig (dh 999 Millis, um ein Byte oder zwei Sekunden aus irgendeinem Grund zu sparen), aber es sollte so sein, dass der Rasenmäher sich weiterhin auf natürliche Weise zu bewegen scheint.

Geben Sie nach Möglichkeit eine visuelle Darstellung an (TIO, Snippet, GIF usw.).

Das ist , also gewinnt die kürzeste Antwort in Bytes.

Stephen
quelle
3
Schöne Herausforderung! Wenn Sie aus der Perspektive einer Person sprechen, die sich über Kabel ärgert, werden Sie wahrscheinlich über
Kabel
Dürfen wir davon ausgehen, dass das Ausgabefenster für den Rasen geeignet ist?
Adám,
Möglicherweise möchten Sie auch eine Liste aller Status zurückgeben, ähnlich wie in Ihrem Beispiellauf.
Adám,
3
Was ist, wenn wir unseren Rasen richtig mähen möchten? s-media-cache-ak0.pinimg.com/736x/92/5c/7c/…
tuskiomi
3
@tuskiomi Ich habe eine weitere Herausforderung in den Arbeiten, die auf der gleichen Idee basiert, aber wo der Programmierer die Kontrolle darüber hat, wie es gemäht wird :)
Stephen

Antworten:

4

JavaScript (ES6 / Node.js), 664 525 523 Zeichen

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')}}

Mit Kommentaren unbegrenzt:

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);

Anmerkung: Ich nehme an, ich sollte das 'sleep'-Paket entfernen und mit setTimeout neu schreiben, um knotenunabhängig zu sein

Axarydax
quelle
Ich habe versucht, dies in TIO zu speichern (es heißt, es funktioniert für node.js). Irgendeine Ahnung, warum es nicht funktioniert?
Stephen
wegen des '
Schlaf'