ตัดหญ้าเป็นรูปสี่เหลี่ยมผืนผ้า


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 millis เพื่อบันทึกไบต์หรือสองวินาทีด้วยเหตุผลบางอย่าง) แต่ควรเป็นเช่นนั้นเครื่องตัดหญ้ายังคงเคลื่อนไหวตามธรรมชาติ

หากเป็นไปได้ให้จัดทำภาพ (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);

หมายเหตุ: ฉันคิดว่าฉันควรได้รับแพคเกจ 'sleep' และเขียนใหม่ด้วย setTimeout เพื่อให้ nodejs เป็นอิสระ


ฉันลองผสานมันเข้ากับTIO (มันบอกว่ามันใช้งานได้กับ node.js) เบาะแสใด ๆ ที่ทำให้มันไม่ทำงาน?
Stephen

เนื่องจากโมดูล 'sleep' - ฉันจะกำจัดมันออกไป
Axarydax
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.