Cắt cỏ hình chữ nhật


17

Một bãi cỏ được định nghĩa là một trường hình chữ nhật với một ký tự được bao quanh bởi hai lớp khoảng trắng có thể nhìn thấy . Điều này có nghĩa là hai dòng trên và twos bên dưới và hai phần đệm ở bên trái (bên phải có khoảng trắng có thể nhìn thấy, vì vậy bạn không cần phải bao gồm nó).

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

Một bãi cỏ bị cắt xén là một cấu trúc tương tự, ngoại trừ nhân vật chính là phiên bản rút gọn của nhân vật đầu tiên.

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

Một máy cắt là hai nhân vật khác nhau, khác với hai nhân vật bãi cỏ. Dưới đây là một ví dụ, với =mặt sau của máy cắt và omặt trước:

=o

Một máy cắt sẽ di chuyển xung quanh bãi cỏ theo chiều dọc, và cũng có thể xoay ở mặt trước của nó. Máy cắt ở trên có thể trông giống như bất kỳ cái nào dưới đây trong một số điểm trong hình ảnh động:

=o 
  
o= 
  
o
=
  
=
o

Máy cắt có thể bắt đầu trên bất kỳ tập hợp các vị trí dưới đây trên bãi cỏ bên dưới. Máy cắt cỏ osẽ lái xe quanh bãi cỏ theo chiều kim đồng hồ. Máy cắt cỏ 0sẽ lái xe quanh bãi cỏ ngược chiều kim đồng hồ.

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

Hoạt hình bắt đầu ở giây thứ 0. Mỗi giây, máy cắt di chuyển về phía trước một khoảng trống và cắt cỏ ở mặt trước của nó. Khi máy cắt bỏ một chỗ, nó xuất hiện cắt. Khi mặt trước của máy cắt đạt đến vật phẩm chưa cắt cuối cùng trên một đường (và vẫn còn cỏ chưa cắt), mặt sau của máy cắt sẽ quay một lần để tiếp tục cắt cỏ hiện tại (giữ theo chiều kim đồng hồ / ngược chiều kim đồng hồ dựa trên vị trí ban đầu) Khi máy cắt kết thúc, nó tiếp tục đi thẳng (cắt cỏ đã cắt cỏ) cho đến khi nó hoàn toàn rời khỏi bãi cỏ.

Với một máy cắt bắt đầu ở phía trên bên trái, điều này cho thấy sự tiến triển cơ bản cho một bãi cỏ 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....     =....     .....     .....     .....     .....     .....     .....     .....
                                                                                                                                              =
  

Đầu vào

Đầu vào của bạn sẽ là kích thước của bãi cỏ (hai số nguyên).

Đầu ra

In bãi cỏ và máy cắt ở vị trí bạn đã chọn. Bạn có thể chọn bốn ký tự cho cỏ, cắt cỏ, cắt trước và cắt lại. Bạn chỉ cần đủ khoảng trắng để hiển thị nội dung của giây hiện tại cho thông số kỹ thuật, nhưng khoảng trắng bổ sung hoàn toàn được phép, miễn là nó trông giống nhau.

Vì đây là , bạn có thể xóa đầu ra mỗi giây hoặc in đủ dòng mới để xuất hiện động trong khung xem (bạn có thể giả sử khung xem là kích thước cần thiết để xuất hiện để tạo hiệu ứng).

Một khoảng thời gian nhất quán khác với một giây được cho phép (ví dụ 999 mili giây để tiết kiệm một byte hoặc hai giây vì một lý do nào đó), nhưng nó phải như vậy mà máy cắt cỏ vẫn có vẻ di chuyển tự nhiên.

Nếu có thể, hãy cung cấp một hình ảnh (TIO, Đoạn trích, GIF, v.v.)

Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.


3
Thử thách tốt đẹp! Phát biểu từ góc nhìn của một người bị làm phiền bởi dây điện, có lẽ bạn sẽ kết thúc việc cắt dây của mình :)
HyperNeutrino

Chúng tôi có thể giả định rằng cửa sổ đầu ra có kích thước phù hợp với bãi cỏ?
Adám

Một cái gì đó khác mà bạn có thể muốn cho phép là trả về một danh sách tất cả các trạng thái, tương tự như ví dụ chạy của bạn.
Adám

3
Điều gì nếu chúng ta muốn cắt cỏ đúng cách? s-media-cache-ak0.pinimg.com/736x/92/5c/7c/iêu
tuskiomi

3
@tuskiomi Tôi đã có một thử thách khác trong các tác phẩm dựa trên cùng một ý tưởng, nhưng nơi lập trình viên kiểm soát cách thức nó được cắt bỏ :)
Stephen

Câu trả lời:


4

JavaScript (ES6 / Node.js), 664 525 523 ký tự

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

Chưa hoàn thành với các bình luận:

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

lưu ý: Tôi cho rằng tôi nên lấy gói 'ngủ' và viết lại với setTimeout để độc lập với nodejs


Tôi đã thử gắn cái này vào TIO (nó nói rằng nó hoạt động cho node.js). Bất kỳ manh mối tại sao nó không hoạt động?
Stephen

bởi vì mô-đun 'ngủ' - tôi sẽ thoát khỏi nó
Axarydax
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.