Косить прямоугольный газон

17

Газон определяется как прямоугольное поле с одним символом, окруженное двумя слоями видимого пробела. Это означает две строки выше и две строки внизу, а также два пробела слева (справа есть видимый пробел, поэтому вам не нужно его включать).

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

Скошенный газон имеет аналогичную структуру, за исключением того, что главный герой является укороченной версией первого персонажа.

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

Газонокосилка - это два разных персонажа, отличных от двух газонных персонажей. Вот пример с =задней частью косилки и oпередней частью :

=o

Газонокосилка будет двигаться вокруг газона вертикально, а также может вращаться вперед. Вышеуказанная косилка может выглядеть как любая из нижеприведенных во время анимации:

=o 
  
o= 
  
o
=
  
=
o

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

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

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

С косилкой, начинающейся слева вверху, это показывает основной прогресс для газона 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....     =....     .....     .....     .....     .....     .....     .....     .....
                                                                                                                                              =
  

вход

В качестве входных данных будут использоваться размеры газона (два целых числа).

Выход

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

Поскольку это , вы можете либо очищать вывод каждую секунду, либо печатать достаточно новых строк, чтобы отобразить анимацию в кадре просмотра (вы можете предположить, что размер рамки просмотра соответствует размеру анимации).

Допускается согласованный интервал времени, отличный от одной секунды (т. Е. 999 миллисекунд, чтобы сэкономить байт, или две секунды по какой-то причине), но он должен быть таким, чтобы газонокосилка все еще двигалась естественным образом.

Если возможно, предоставьте визуальную информацию (TIO, Snippet, GIF и т. Д.)

Это , поэтому выигрывает самый короткий ответ в байтах.

Стивен
источник
3
Отличный вызов! Говоря с точки зрения человека, которого раздражают провода, вы, вероятно, в конечном итоге
косите
Можем ли мы предположить, что размер выходного окна соответствует газону?
Адам
Что-то еще, что вы можете разрешить, - это возвращение списка всех состояний, аналогично вашему примеру выполнения.
Адам
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);

примечание: я полагаю, что я должен получить пакет 'sleep' и переписать с setTimeout, чтобы он был независим от nodejs

Axarydax
источник
Я попытался вставить это в TIO (он говорит, что это работает для node.js). Любая подсказка, почему это не работает?
Стивен
из-за модуля «сна» - я
избавлюсь