วาดและติดป้ายกริดหกเหลี่ยม ASCII


12

ในการท้าทายครั้งก่อนของฉันฉันวาดไดอะแกรมแรกด้วยมือเป็นส่วนใหญ่ (ด้วยความช่วยเหลือของโหมดบล็อกที่มองเห็นเป็นกลุ่ม) แต่แน่นอนว่าต้องมีวิธีที่ดีกว่า ...


รับอินพุตสองมิติความกว้างและความสูงส่งออกตารางหกเหลี่ยมกับมิติเหล่านั้นในงานศิลปะ ASCII

นี่คือแผนภาพที่อ้างอิงในบทนำ (ด้วยการแก้ไขเล็กน้อย) ซึ่งควรเป็นผลลัพธ์ของคุณสำหรับอินพุตwidth=7, height=3:

         _____         _____         _____
        /     \       /     \       /     \
  _____/ -2,-1 \_____/  0,-1 \_____/  2,-1 \_____
 /     \       /     \       /     \       /     \
/ -3,-1 \_____/ -1,-1 \_____/  1,-1 \_____/  3,-1 \
\       /     \       /     \       /     \       /
 \_____/ -2,0  \_____/  0,0  \_____/  2,0  \_____/
 /     \       /     \       /     \       /     \
/ -3,0  \_____/ -1,0  \_____/  1,0  \_____/  3,0  \
\       /     \       /     \       /     \       /
 \_____/ -2,1  \_____/  0,1  \_____/  2,1  \_____/
 /     \       /     \       /     \       /     \
/ -3,1  \_____/ -1,1  \_____/  1,1  \_____/  3,1  \
\       /     \       /     \       /     \       /
 \_____/       \_____/       \_____/       \_____/

สังเกตเห็นหลายสิ่ง:

  • ความกว้างและความสูงนั้นเทียบเท่ากับจำนวนหกเหลี่ยมที่มีสำหรับพิกัด y และ x ตามลำดับ เหล่านี้จะมักจะเป็นเลขคี่

  • รูปหกเหลี่ยมแต่ละรูปแสดงด้วยศิลปะ ASCII

      _____
     /     \
    /       \
    \       /
     \_____/
    

    แต่เส้นขอบจะ "แชร์" ระหว่างรูปหกเหลี่ยมที่อยู่ใกล้เคียง

  • เครื่องหมายจุลภาคในพิกัดมักจะเป็นอักขระสองตัวที่อยู่ด้านล่างตรงกลางของขอบด้านบนเสมอ พิกัด x นั้นจะถูกวางตำแหน่งตรงหน้าเครื่องหมายจุลภาคและพิกัด y โดยตรงหลังจากนั้น

    คุณอาจยืนยันว่าพิกัดจะไม่ใหญ่เกินไปเช่นที่พวกเขาจะทับขอบของรูปหกเหลี่ยม

อินพุตอาจถูกใช้เป็นสตริง whitespace- / คั่นด้วยเครื่องหมายจุลภาคอาร์เรย์ของจำนวนเต็มหรืออาร์กิวเมนต์สองฟังก์ชัน / commandline เอาต์พุตต้องเป็นสตริงเดี่ยว (ถึง STDOUT เป็นค่าส่งคืนและอื่น ๆ )

เนื่องจากนี่คือรหัสที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ

ตารางด้านบนสามารถใช้เป็นกรณีทดสอบได้ width=199, height=199กริดขนาดสูงสุด เห็นได้ชัดว่าไม่สามารถรวมได้ที่นี่ แต่แถวและคอลัมน์แรก ๆ ควรมีลักษณะดังต่อไปนี้:

         _____         ___
        /     \       /   
  _____/-98,-99\_____/-96,
 /     \       /     \    
/-99,-99\_____/-97,-99\___
\       /     \       /   
 \_____/-98,-98\_____/-96,
 /     \       /     \    
/-99,-98\_____/-97,-98\___
\       /     \       /   
 \_____/-98,-97\_____/-96,
 /     \       /     \    
/-99,-97\_____/-97,-97\___
\       /     \       /   

คำตอบ:


2

ทับทิม 221 ไบต์

->w,h{s=' '
a=(s*9+?_*5)*(w/2)+$/
(2-h*2).upto(h*2+3){|y|c=y<4-h*2 
a+=[b=c ?s:?\\,s+b,s,''][y%4]
(0-w/2).upto(w/2){|x|a+=["/#{h<y/2?s*7:"%3d,%-3d"}\\",s*7,?_*5,"/     \\"][(y+x*2+w)%4]%[x,y/4]}
a+='//  '[c ?3:y%4]+$/}
a}

Ungolfed ในโปรแกรมทดสอบ

f=->w,h{
  s=' '                                #set s to space for golfing reasons
  a=(s*9+?_*5)*(w/2)+$/                #start building the output with a row of just _ and space

  (2-h*2).upto(h*2+3){|y|              #iterate 4 times for each row of hexagons, plus an extra 2 at the end to finish last row
    c=y<4-h*2                          #condition for first two rows
    a+=[b=c ?s:?\\,s+b,s,''][y%4]      #string to be output before main set of hexagons (spaces for top row, \ for certain other rows

    (0-w/2).upto(w/2){|x|              #iterate through hexagons on each row, 4 lines for each with the following printf type string
      a+=["/#{h<y/2?s*7:"%3d,%-3d"}\\",#line 1:contains ends / \ and numbers 
         s*7,                          #line 2 padding spaces
         ?_*5,                         #line 3 padding ___
         "/     \\"][(y+x*2+w)%4]%     #line 0 top of hexagon / \; formula to select string to be printed
           [x,y/4]                     #numbers to be printed (if format for current line does not require them they are ignored)
    }

    a+='//  '[c ?3:y%4]+$/             #ending alternates between / and space; / are suppressed for first two rows
  }
  a
}

puts g[7,3]
puts g[5,5]

เอาท์พุต

ขณะที่ฉันกำลังดีบั๊กฉันสังเกตเห็นความกำกวมในสเป็ค ที่ไหนw+1คือหารด้วย 4 แรกและครั้งสุดท้ายพิกัด x เป็นแปลกและไม่มีความคลุมเครือ แต่ที่w-1หารด้วย 4 พิกัด x แรกและสุดท้ายได้เท่ากัน ฉันสันนิษฐานว่าคอลัมน์แรกและคอลัมน์สุดท้ายควรมีค่าต่ำกว่าคอลัมน์ถัดไป แต่จากนั้นฉันอ่านคำถามก่อนหน้านี้และตั้งข้อสังเกตในกรณีนั้นมันเป็นคอลัมน์คี่ที่ควรจะชดเชยด้านล่างแม้แต่คู่ (หมายเหตุสำหรับการw-1หารด้วย 4 มันเป็นไปไม่ได้ที่จะทำทั้งสองอย่าง)

อย่างไรก็ตามความแตกต่างดังกล่าวไม่ได้เกิดขึ้นในคำถามนี้ ฉันจะปล่อยให้เรื่องนี้ขึ้นอยู่กับการตัดสินใจของ OP และทำงานซ้ำหากจำเป็นแม้ว่าฉันจะไม่ต้องการ

         _____         _____         _____
        /     \       /     \       /     \
  _____/ -2,-1 \_____/  0,-1 \_____/  2,-1 \_____
 /     \       /     \       /     \       /     \
/ -3,-1 \_____/ -1,-1 \_____/  1,-1 \_____/  3,-1 \
\       /     \       /     \       /     \       /
 \_____/ -2,0  \_____/  0,0  \_____/  2,0  \_____/
 /     \       /     \       /     \       /     \
/ -3,0  \_____/ -1,0  \_____/  1,0  \_____/  3,0  \
\       /     \       /     \       /     \       /
 \_____/ -2,1  \_____/  0,1  \_____/  2,1  \_____/
 /     \       /     \       /     \       /     \
/ -3,1  \_____/ -1,1  \_____/  1,1  \_____/  3,1  \
\       /     \       /     \       /     \       /
 \_____/       \_____/       \_____/       \_____/
         _____         _____
        /     \       /     \
  _____/ -1,-2 \_____/  1,-2 \_____
 /     \       /     \       /     \
/ -2,-2 \_____/  0,-2 \_____/  2,-2 \
\       /     \       /     \       /
 \_____/ -1,-1 \_____/  1,-1 \_____/
 /     \       /     \       /     \
/ -2,-1 \_____/  0,-1 \_____/  2,-1 \
\       /     \       /     \       /
 \_____/ -1,0  \_____/  1,0  \_____/
 /     \       /     \       /     \
/ -2,0  \_____/  0,0  \_____/  2,0  \
\       /     \       /     \       /
 \_____/ -1,1  \_____/  1,1  \_____/
 /     \       /     \       /     \
/ -2,1  \_____/  0,1  \_____/  2,1  \
\       /     \       /     \       /
 \_____/ -1,2  \_____/  1,2  \_____/
 /     \       /     \       /     \
/ -2,2  \_____/  0,2  \_____/  2,2  \
\       /     \       /     \       /
 \_____/       \_____/       \_____/
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.