Memotong Rumput Persegi Panjang


17

Rumput didefinisikan sebagai bidang persegi panjang dengan satu karakter yang dikelilingi oleh dua lapisan spasi putih yang terlihat . Ini berarti dua baris di atas dan dua baris di bawah, dan dua spasi di sebelah kiri (kanan memiliki spasi putih yang terlihat, jadi Anda tidak perlu memasukkannya).

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

Rumput yang dipangkas adalah struktur yang serupa, kecuali bahwa karakter utama adalah versi singkat dari karakter pertama.

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

Mesin pemotong rumput adalah dua karakter yang berbeda, berbeda dari dua karakter halaman. Berikut ini sebuah contoh, dengan =sebagai bagian belakang mesin pemotong rumput dan osebagai bagian depan:

=o

Mesin pemotong rumput akan bergerak di sekitar halaman secara vertikal, dan juga dapat memutar di bagian depannya. Mesin pemotong di atas mungkin terlihat seperti di bawah ini selama beberapa saat dalam animasi:

=o 
  
o= 
  
o
=
  
=
o

Mesin pemotong rumput dapat mulai pada setiap set posisi di bawah ini di halaman di bawah ini. Mesin pemotong rumput dengan oakan berkeliling di sekitar halaman searah jarum jam. Mesin pemotong rumput dengan 0akan berkeliling halaman berlawanan arah jarum jam.

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

Animasi dimulai pada detik ke 0. Setiap detik, mesin pemotong bergerak maju satu ruang, dan memotong rumput di bagian depannya. Ketika mesin pemotong mengosongkan suatu tempat, tampaknya dipotong. Ketika bagian depan mesin pemotong mencapai item yang belum dipotong pada suatu garis (dan masih ada potongan rumput), bagian mesin pemotong kembali berputar satu kali untuk melanjutkan memotong saat ini (tetap dalam arah jarum jam / berlawanan arah jarum jam berdasarkan posisi asli) Ketika mesin pemotong selesai, terus lurus (memotong rumput sudah memotong) sampai benar-benar keluar dari halaman.

Dengan mesin pemotong dimulai di kiri atas, ini menunjukkan perkembangan dasar untuk halaman 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....     =....     .....     .....     .....     .....     .....     .....     .....
                                                                                                                                              =
  

Memasukkan

Input Anda akan menjadi dimensi halaman (dua bilangan bulat).

Keluaran

Cetak halaman dan mesin pemotong rumput di posisi yang Anda pilih. Anda dapat memilih empat karakter untuk rumput, memotong rumput, depan mesin pemotong rumput, dan mesin pemotong rumput kembali. Anda hanya perlu ruang kosong yang cukup untuk menampilkan konten detik yang sekarang untuk spesifikasi, tetapi ruang putih tambahan sepenuhnya diizinkan, asalkan terlihat sama.

Karena ini adalah , Anda dapat mengosongkan output setiap detik, atau mencetak cukup baris baru agar tampak beranimasi dalam bingkai tampilan (Anda dapat mengasumsikan bingkai tampilan adalah ukuran yang diperlukan untuk tampak beranimasi).

Interval waktu yang konsisten selain dari satu detik diperbolehkan (yaitu 999 milid untuk menghemat satu byte, atau dua detik untuk beberapa alasan), tetapi harus sedemikian rupa sehingga mesin pemotong rumput tampaknya masih bergerak secara alami.

Jika memungkinkan, berikan visual (TIO, Cuplikan, GIF, dll.)

Ini adalah , jadi jawaban tersingkat dalam byte menang.


3
Tantangan yang bagus! Berbicara dari sudut pandang seseorang yang terganggu oleh kabel, Anda mungkin akan berakhir dengan memotong kawat Anda :)
HyperNeutrino

Bolehkah kita berasumsi bahwa jendela keluaran berukuran agar sesuai dengan halaman?
Adám

Hal lain yang mungkin ingin Anda izinkan adalah mengembalikan daftar semua status, mirip dengan contoh Anda menjalankan.
Adám

3
Bagaimana jika kita suka memotong rumput dengan cara yang benar? s-media-cache-ak0.pinimg.com/736x/92/5c/7c/…
tuskiomi

3
@tuskiomi Saya punya tantangan lain dalam karya-karya berdasarkan ide yang sama, tetapi di mana programmer memiliki kontrol atas bagaimana itu dipangkas :)
Stephen

Jawaban:


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

Tidak dijinakkan dengan komentar:

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

Catatan: Saya kira saya harus mendapatkan paket 'sleep' dan menulis ulang dengan setTimeout menjadi nodejs independent


Saya mencoba memasukkan ini ke dalam TIO (katanya berfungsi untuk node.js). Adakah petunjuk mengapa itu tidak berhasil?
Stephen

karena modul 'tidur' - saya akan menyingkirkannya
Axarydax
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.