Косимо прямокутний газон


17

Галявина визначається як прямокутне поле з одним символом, оточене двома шарами видимого пробілу. Це означає, що два рядки вгорі та дві лінії внизу, і ліворуч прокладки зліва (справа має видимий пробіл, тому не потрібно включати його).

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

Косина галявина має подібну будову, за винятком того, що головний герой - це скорочена версія першого персонажа.

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

Косарка - це два різних символи, що відрізняються від двох символів газону. Ось приклад =як із задньої частини косарки, oтак і спереду:

=o

Косарка буде рухатися навколо газону вертикально, а також може обертатися на передній частині. Наведена вище косарка може виглядати як будь-яка з наведених нижче під час певної анімації:

=o 
  
o= 
  
o
=
  
=
o

Газонокосарка може заводитися на будь-якому наборі нижче розташованих на газоні нижче. Косарки з oби їхали навколо газону за годинниковою стрілкою. Косарки з 0би їхали навколо газону проти годинникової стрілки.

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

Анімація починається з другої 0. Кожну секунду косарка рухається вперед на один простір, і стриже траву на передній частині. Коли косарка очищує пляму, вона видається порізаною. Коли передня косарка досягає останнього необрізаного елемента на лінії (а трава все ще залишається), назад косарка повертається один раз, щоб продовжувати поточну косилку (залишаючись за годинниковою / проти годинникової стрілки за вихідним положенням) Коли косарка закінчена, вона продовжується прямо (косить вже обрізану траву) до повного виходу з газону.

Коли косарка починається зліва вгорі, це показує основний прогрес для газону 5х3:

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

Вхідні дані

Вашим входом будуть розміри газону (два цілих числа).

Вихідні дані

Роздрукуйте газон та косарку у вибраному вами місці. Ви можете обрати чотири символи для трави, скошеної трави, передньої косарки та задньої косарки. Вам потрібно лише достатньо пробілів, щоб показати вміст поточної секунди у специфікаціях, але додатковий пробіл повністю дозволений, якщо він виглядає однаково.

Оскільки це , ви можете або очистити висновок щосекунди, або надрукувати достатньо нових рядків, щоб з'явитись для анімації в кадрі перегляду (ви можете припустити, що рамка перегляду - це розмір, необхідний для анімації).

Допускається послідовний інтервал часу, який не є однією секундою (тобто 999 мільйонів, щоб зберегти байт, або дві секунди з якихось причин), але він повинен бути таким, щоб газонокосарка все-таки рухалася природним шляхом.

Якщо можливо, надайте наочне зображення (TIO, Snippet, 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);

Примітка: я вважаю, що мені слід отримати пакет "сон" і переписати з setTimeout, щоб бути незалежним від nodejs


Я спробував вставити це в TIO (там написано, що він працює для node.js). Будь-яка підказка, чому це не працює?
Стівен

через модуль "сон" - я його
позбудусь
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.