Falciare un prato rettangolare


17

Un prato è definito come un campo rettangolare con un carattere circondato da due strati di spazi bianchi visibili . Ciò significa due righe in alto e due righe in basso e una spaziatura di due spazi a sinistra (la destra ha spazi bianchi visibili, quindi non è necessario includerla).

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

Un prato falciato è una struttura simile, tranne per il fatto che il personaggio principale è una versione abbreviata del primo personaggio.

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

Una falciatrice è composta da due personaggi diversi, diversi dai due personaggi del prato. Ecco un esempio, con =come la parte posteriore del tosaerba e ocome la parte anteriore:

=o

Un tosaerba si sposta verticalmente attorno al prato e può anche ruotare sulla sua parte anteriore. Il rasaerba sopra può apparire come in uno dei seguenti punti durante l'animazione:

=o 
  
o= 
  
o
=
  
=
o

Il tosaerba può iniziare su qualsiasi set delle posizioni sottostanti sul prato sottostante. Le falciatrici oavrebbero guidato attorno al prato in senso orario. Le falciatrici 0avrebbero guidato attorno al prato in senso antiorario.

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

L'animazione inizia al secondo 0. Ogni secondo, il rasaerba si sposta in avanti di uno spazio e taglia l'erba sul davanti. Quando il tosaerba lascia un punto, sembra tagliato. Quando la parte anteriore del rasaerba raggiunge l'ultimo elemento non tagliato su una linea (e c'è ancora erba non tagliata), il rasaerba posteriore ruota una volta in modo da continuare l'attuale taglio (rimanendo in senso orario / antiorario in base alla posizione originale) Al termine, continua dritto (falciatura dell'erba già tagliata) fino a quando non è completamente fuori dal prato.

Con un tosaerba che parte dalla parte superiore sinistra, questo mostra la progressione di base per un prato 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....     =....     .....     .....     .....     .....     .....     .....     .....
                                                                                                                                              =
  

Ingresso

Il tuo input sarà la dimensione del prato (due numeri interi).

Produzione

Stampa il prato e il tosaerba nella posizione prescelta. È possibile scegliere i quattro caratteri per erba, erba tagliata, parte anteriore del tosaerba e parte posteriore del tosaerba. Hai solo bisogno di abbastanza spazio bianco per mostrare il contenuto del secondo attuale alle specifiche, ma lo spazio bianco extra è completamente consentito, purché appaia lo stesso.

Dato che si tratta di , è possibile cancellare l'output ogni secondo o stampare un numero sufficiente di righe per sembrare animare nel riquadro di visualizzazione (è possibile supporre che il riquadro di visualizzazione abbia le dimensioni necessarie per apparire per animare).

È consentito un intervallo di tempo coerente diverso da un secondo (ovvero 999 millis per salvare un byte o due secondi per qualche motivo), ma dovrebbe essere tale che il tosaerba continui a muoversi in modo naturale.

Se possibile, fornire un oggetto visivo (TIO, Snippet, GIF, ecc.)

Questo è , quindi vince la risposta più breve in byte.


3
Bella sfida! Parlando dal punto di vista di una persona che è infastidita dai fili, probabilmente
finiresti

Possiamo supporre che la finestra di output sia dimensionata per adattarsi al prato?
Adám,

Qualcos'altro che potresti voler consentire è restituire un elenco di tutti gli stati, simile alla tua corsa di esempio.
Adám,

3
E se ci piace tagliare il prato nel modo giusto? s-media-cache-ak0.pinimg.com/736x/92/5c/7c/…
tuskiomi

3
@tuskiomi Ho un'altra sfida nei lavori basata sulla stessa idea, ma in cui il programmatore ha il controllo su come viene falciato :)
Stephen,

Risposte:


4

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

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

Non modificato con commenti:

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

nota: suppongo che dovrei ottenere il pacchetto 'sleep' e riscrivere con setTimeout per essere indipendente da nodejs


Ho provato a inserirlo in TIO (dice che funziona per node.js). Qualche idea sul perché non funzioni?
Stephen,

a causa del modulo "sleep" - mi sbarazzerò di esso
Axarydax,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.