Dikdörtgen Çim Biçme


17

Bir çim, iki karakter görünür boşlukla çevrelenmiş bir karakterin bulunduğu dikdörtgen bir alan olarak tanımlanır . Bu, iki satır üstte ve iki satır altta ve solda iki boşluk dolgusu anlamına gelir (sağda görünür boşluk vardır, bu yüzden eklemenize gerek yoktur).

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

Biçilmiş bir çim benzer bir yapıdır, ancak ana karakter ilk karakterin kısaltılmış bir versiyonudur.

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

Biçici, iki çim karakterinden farklı iki farklı karakterdir. Biçicinin =arkası ve oön tarafı olarak bir örnek :

=o

Bir biçici çimin etrafında dikey olarak hareket eder ve ön tarafında da dönebilir. Yukarıdaki biçme makinesi animasyonun bir noktasında aşağıdakilerden herhangi birine benzeyebilir:

=o 
  
o= 
  
o
=
  
=
o

Çim biçme makinesi, aşağıdaki çimde aşağıdaki konumlardan herhangi birinde çalışabilir. Çim biçme makineleri osaat yönünde çim etrafında sürücü. Çim biçme makineleri 0, çim etrafında saat yönünün tersine hareket eder.

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

Animasyon 0. saniyede başlar. Her saniye, biçici bir boşluk ileri gider ve önündeki çimleri keser. Biçici bir noktayı boşalttığında kesilmiş gibi görünür. Çim biçme makinesi önü bir hat üzerindeki son kesilmemiş öğeye ulaştığında (ve hala kesilmemiş çim varsa), biçme makinesi mevcut biçiciye devam etmek için bir kez döner (orijinal konuma göre saat yönünde / saat yönünün tersinde kalır), Çim biçme makinesi bittiğinde, çimden tamamen çıkıncaya kadar düz devam eder (biçilmiş çim biçme).

Bir çim biçme makinesi sol üst kısımdan başlayarak, bu 5x3 çim için temel ilerlemeyi gösterir:

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

Giriş

Girişiniz çimlerin boyutları olacaktır (iki tamsayı).

Çıktı

Çim ve biçme makinesini seçtiğiniz konumda yazdırın. Çim, çim biçme, ön çim biçme ve çim biçme için dört karakter seçebilirsiniz. Yalnızca geçerli saniyenin içeriğini spesifikasyonlara göstermek için yeterli boşluk alanına ihtiyacınız vardır, ancak aynı göründüğü sürece ekstra boşluklara tamamen izin verilir.

Bu bir , çıktıyı her saniye temizleyebilir veya görüntüleme çerçevesinde canlandırmak için yeterince yeni satır yazdırabilirsiniz (görüntüleme çerçevesinin canlandırmak için gereken boyut olduğunu varsayabilirsiniz).

Bir saniyeden başka tutarlı bir zaman aralığına izin verilir (yani 999 milis bir baytı kurtarmak için veya bir nedenden dolayı iki saniye), ancak çim biçme makinesinin hala doğal olarak hareket ettiği görülmelidir.

Mümkünse görsel (TIO, Snippet, GIF, vb.) Sağlayın

Bu , bayt en kısa cevap kazanır.


3
Güzel meydan okuma! Tellerden rahatsız olan bir kişinin bakış açısından
konuşursanız

Çıktı penceresinin çimlere uyacak şekilde boyutlandırıldığını varsayabilir miyiz?
Adam

İzin vermek isteyebileceğiniz başka bir şey, örnek çalışmanıza benzer şekilde tüm durumların bir listesini döndürmektir.
Adam

3
Çimimizi doğru şekilde biçmeyi seversek ne olur? s-media-cache-ak0.pinimg.com/736x/92/5c/7c/…
tuskiomi

3
@tuskiomi Aynı fikre dayalı çalışmalarda başka bir zorluğum var, ancak programcının nasıl biçildiği üzerinde kontrol sahibi olduğu :)
Stephen

Yanıtlar:


4

JavaScript (ES6 / node.js), 664 525 523 karakter

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

Yorumlarla sonlandırılmadı:

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

not: Sanırım 'uyku' paketini almalı ve setTimeout ile nodejs bağımsız olmak için yeniden yazmalıyım


Bu TIO yapışmasını denedim (node.js için çalışıyor diyor). Neden işe yaramadığına dair bir ipucu var mı?
Stephen

çünkü 'uyku' modülü - ondan kurtulacakım
Axarydax
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.