Tondre une pelouse rectangulaire

17

Une pelouse est définie comme un champ rectangulaire avec un caractère entouré de deux couches d' espaces blancs visibles . Cela signifie deux lignes au-dessus et deux lignes au-dessous, et un remplissage à deux espaces à gauche (la droite a des espaces visibles, vous n'avez donc pas besoin de l'inclure).

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

Une pelouse tondue est une structure similaire, sauf que le personnage principal est une version abrégée du premier caractère.

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

Une tondeuse a deux caractères différents, différents des deux personnages de pelouse. Voici un exemple, avec =comme arrière de la tondeuse et ocomme avant:

=o

Une tondeuse se déplacera autour de la pelouse verticalement et pourra également tourner sur sa face avant. La tondeuse ci-dessus peut ressembler à l'une des images ci-dessous à un moment donné de l'animation:

=o 
  
o= 
  
o
=
  
=
o

La tondeuse peut démarrer sur n'importe quel ensemble des positions ci-dessous sur la pelouse ci-dessous. Tondeuses aveco circuleraient dans le sens des aiguilles d'une montre. Les tondeuses avec 0rouleraient autour de la pelouse dans le sens antihoraire.

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

L'animation commence au deuxième 0. Chaque seconde, la tondeuse avance d'un espace et coupe l'herbe sur le devant. Lorsque la tondeuse quitte un endroit, elle apparaît coupée. Lorsque l'avant de la tondeuse atteint le dernier élément non coupé d'une ligne (et qu'il y a encore de l'herbe non coupée), le dos de la tondeuse tourne une fois afin de continuer la tonte actuelle (en restant dans le sens horaire / antihoraire en fonction de la position d'origine). Lorsque la tondeuse est terminée, il continue tout droit (tonte d'herbe déjà coupée) jusqu'à ce qu'il soit complètement hors de la pelouse.

Avec une tondeuse démarrant en haut à gauche, cela montre la progression de base pour une pelouse 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....     =....     .....     .....     .....     .....     .....     .....     .....
                                                                                                                                              =
  

Contribution

Votre entrée sera les dimensions de la pelouse (deux entiers).

Production

Imprimez la pelouse et la tondeuse dans la position que vous avez choisie. Vous pouvez choisir les quatre caractères pour l'herbe, l'herbe coupée, l'avant de la tondeuse et l'arrière de la tondeuse. Vous n'avez besoin que de suffisamment d'espace pour afficher le contenu de la seconde actuelle selon les spécifications, mais un espace supplémentaire est complètement autorisé, tant qu'il a la même apparence.

Puisqu'il s'agit d'une , vous pouvez soit effacer la sortie chaque seconde, soit imprimer suffisamment de nouvelles lignes pour apparaître pour animer dans le cadre de visualisation (vous pouvez supposer que le cadre de visualisation est de la taille nécessaire pour apparaître pour animer).

Un intervalle de temps cohérent autre qu'une seconde est autorisé (c.-à-d. 999 millis pour économiser un octet, ou deux secondes pour une raison quelconque), mais il devrait être tel que la tondeuse à gazon semble toujours se déplacer naturellement.

Si possible, fournissez un visuel (TIO, Snippet, GIF, etc.)

C'est le , donc la réponse la plus courte en octets l'emporte.

Stephen
la source
3
Beau défi! Parlant du point de vue d'une personne qui est ennuyée par les fils, vous finiriez probablement par tondre sur votre fil :)
HyperNeutrino
Pouvons-nous supposer que la fenêtre de sortie est dimensionnée pour s'adapter à la pelouse?
2017
Vous pouvez également autoriser le retour d'une liste de tous les états, similaire à votre exemple.
2017
3
Et si nous aimons tondre notre pelouse dans le bon sens? s-media-cache-ak0.pinimg.com/736x/92/5c/7c/…
tuskiomi
3
@tuskiomi J'ai un autre défi dans les travaux basé sur la même idée, mais où le programmeur a le contrôle sur la façon dont il est tondu :)
Stephen

Réponses:

4

JavaScript (ES6 / Node.js), 664 525 523 caractères

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 commenté avec commentaires:

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

note: je suppose que je devrais récupérer le paquet 'sleep' et réécrire avec setTimeout pour être indépendant de nodejs

Axarydax
la source
J'ai essayé de le coller dans TIO (il dit que cela fonctionne pour node.js). Un indice pourquoi cela ne fonctionne pas?
Stephen
à cause du module 'sommeil' - je vais m'en débarrasser
Axarydax