Koś prostokątny trawnik

17

Trawnik jest zdefiniowany jako prostokątne pole z jednym znakiem otoczone dwiema warstwami widocznych białych znaków. Oznacza to dwie linie powyżej i dwie linie poniżej oraz dwie spacje po lewej stronie (po prawej widoczna biała spacja, więc nie trzeba jej uwzględniać).

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

Koszony trawnik ma podobną strukturę, tyle że główny bohater jest skróconą wersją pierwszego znaku.

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

Kosiarka to dwie różne postacie, inne niż dwie postacie trawnika. Oto przykład, z =tyłu kosiarki i oprzodu:

=o

Kosiarka porusza się wokół trawnika pionowo, a także może obracać się z przodu. Powyższa kosiarka może wyglądać jak niżej w pewnym momencie animacji:

=o 
  
o= 
  
o
=
  
=
o

Kosiarka może uruchomić się w dowolnym zestawie niżej położonych pozycji na trawniku poniżej. Kosiarki zo po trawniku zgodnie z ruchem wskazówek zegara. Kosiarki poruszałyby się 0po trawniku w kierunku przeciwnym do ruchu wskazówek zegara.

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

Animacja rozpoczyna się od sekundy 0. Co sekundę kosiarka przesuwa się o jedno pole do przodu i kosi trawę z przodu. Gdy kosiarka opuści miejsce, wydaje się być odcięte. Kiedy przód kosiarki dotrze do ostatniego nieciętego przedmiotu na linii (i nadal jest nieoszlifowana trawa), kosiarka obraca się raz, aby kontynuować bieżącą kosiarkę (pozostając w kierunku zgodnym z ruchem wskazówek zegara / przeciwnie do ruchu wskazówek zegara na podstawie pierwotnej pozycji) Po zakończeniu kosiarki, kontynuuje jazdę prosto (koszenie już skoszonej trawy), aż całkowicie wyskoczy z trawnika.

W przypadku kosiarki rozpoczynającej się w lewym górnym rogu, pokazuje to podstawowy postęp dla trawnika 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....     =....     .....     .....     .....     .....     .....     .....     .....
                                                                                                                                              =
  

Wejście

Twój wkład to wymiary trawnika (dwie liczby całkowite).

Wynik

Wydrukuj trawnik i kosiarkę w wybranej pozycji. Możesz wybrać cztery postacie na trawę, ścinać trawę, przód kosiarki i tył kosiarki. Potrzebujesz tylko wystarczającej ilości białych znaków, aby wyświetlić specyfikację bieżącej sekundy, ale dodatkowe białe znaki są całkowicie dozwolone, pod warunkiem, że wyglądają tak samo.

Ponieważ jest to , możesz albo wyczyścić wyjście co sekundę, albo wydrukować wystarczającą liczbę znaków nowej linii, aby pojawiały się w animowanej ramce (możesz założyć, że ramka ma rozmiar potrzebny do animacji).

Dopuszczalny jest stały odstęp czasu inny niż jedna sekunda (tj. 999 milisów, aby zaoszczędzić bajt lub dwie sekundy z jakiegoś powodu), ale powinien być taki, aby kosiarka nadal poruszała się naturalnie.

Jeśli to możliwe, podaj grafikę (TIO, Snippet, GIF itp.)

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Stephen
źródło
3
Niezłe wyzwanie! Mówiąc z perspektywy osoby, która jest zirytowana drutami, prawdopodobnie skończyłbyś kosić nad drutem :)
HyperNeutrino
Czy możemy założyć, że okno wyjściowe ma rozmiar dopasowany do trawnika?
Adám
Inną rzeczą, na którą możesz zezwolić, jest zwracanie listy wszystkich stanów, podobnie jak w twoim przykładowym uruchomieniu.
Adám
3
Co jeśli chcemy kosić trawnik we właściwy sposób? s-media-cache-ak0.pinimg.com/736x/92/5c/7c/…
tuskiomi
3
@tuskiomi Mam inne wyzwanie w pracach opartych na tym samym pomyśle, ale w których programista ma kontrolę nad tym, jak jest koszony :)
Stephen

Odpowiedzi:

4

JavaScript (ES6 / Node.js), 664 525 523 znaków

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

Unminified with comments:

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

Uwaga: Przypuszczam, że powinienem pobrać pakiet „sleep” i napisać ponownie z setTimeout, aby być niezależnym od nodejs

Axarydax
źródło
Próbowałem przykleić to do TIO (mówi, że to działa dla node.js). Wszelkie wskazówki, dlaczego to nie działa?
Stephen
z powodu modułu „uśpienia” - pozbędę się go
Axarydax