สามเหลี่ยมหกเหลี่ยม!


20

งานของคุณ: สร้างสามเหลี่ยมหกเหลี่ยมที่มีความยาวด้านnโดยnมีค่าเป็นจำนวนเต็มบวกหรือ 0

ก่อนอื่นให้ฉันนิยามรูปหกเหลี่ยม

 / \
|   |
 \ /

(ศิลปะ ASCII ที่น่าทึ่งใช่มั้ย)

Hexagons สามารถเชื่อมโยงเข้าด้วยกันโดยการแบ่งปันด้าน:

 / \ / \
|   |   |
 \ / \ /

   / \  
  |   |
 / \ /
|   |
 \ /

สามเหลี่ยมหกเหลี่ยมมีดังต่อไปนี้:

   / \
  |   |
 / \ / \
|   |   |
 \ / \ /

สามเหลี่ยมหกเหลี่ยมนั้นมีความยาวด้านข้างของรูปหกเหลี่ยม 2-- 2 อันเพื่อให้ด้านเดียว รูปสามเหลี่ยมหกเหลี่ยมที่มีความยาวด้าน 1 เป็นเพียงรูปหกเหลี่ยมเดียวและรูปหกเหลี่ยมที่มีความยาวด้าน 0 เป็นค่าว่าง

เป็นทางการมากขึ้นสามเหลี่ยมหกเหลี่ยมเป็นรูปสามเหลี่ยมที่ทำจากรูปหกเหลี่ยมที่เชื่อมโยงกับด้านข้างของพวกเขา รูปหกเหลี่ยมด้านบนเชื่อมโยงไปยังสองด้านล่างที่ด้านล่างทั้งสองด้าน รูปสามเหลี่ยมในลิงค์ด้านล่างซ้ายไปยังลิงค์ไปทางขวาและขวาบนและสามเหลี่ยมที่ลิงค์ด้านล่างซ้ายไปยังลิงค์บนซ้ายและขวาบน มีรูปหกเหลี่ยมอยู่ในระหว่างn-2คนที่มุมเชื่อมต่อกันด้วยด้านตรงข้ามของพวกเขาและจำนวนของพวกเขาคือ สามเหลี่ยมไม่เต็ม

ตัวอย่างเพิ่มเติม:

Side length 3:
     / \
    |   |
   / \ / \
  |   |   |
 / \ / \ / \
|   |   |   |
 \ / \ / \ /

Side length 4:
       / \
      |   |
     / \ / \
    |   |   |
   / \ / \ / \
  |   |   |   |
 / \ / \ / \ / \
|   |   |   |   |
 \ / \ / \ / \ /
(This triangle isn't really filled, the borders make it look like there is a hexagon in the middle, but there is not.)

Side length 5:
         / \
        |   |
       / \ / \
      |   |   |
     / \ / \ / \
    |   |   |   |
   / \ /     \ / \
  |   |       |   |
 / \ / \ / \ / \ / \
|   |   |   |   |   |
 \ / \ / \ / \ / \ /

Side length 6:
           / \
          |   |
         / \ / \
        |   |   |
       / \ / \ / \
      |   |   |   |
     / \ /     \ / \
    |   |       |   |
   / \ /         \ / \
  |   |           |   |
 / \ / \ / \ / \ / \ / \
|   |   |   |   |   |   |
 \ / \ / \ / \ / \ / \ /

22
หากไม่มีคำตอบ Hexagony สำหรับสิ่งนี้ฉันจะสูญเสียศรัทธาทั้งหมดใน @MartinEnder
caird coinheringaahing

@Sououcanreplytomeincomments เรามาพูดกันว่าถ้าฉันสามารถใช้ผู้ใช้ที่นี่พวกเขาจะอยู่ในรายการ
phyrfox


2
ฉันคาดว่าจะเห็นคำตอบสั้น ๆ ใน Charcoal ฉันจะทำเอง แต่ฉันต้องเรียนรู้ก่อนและฉันต้องการดูหนังแทนขออภัย
Neil

3
@Neil คุณจะได้รับการให้อภัยเนื่องจากไม่ได้เรียนภาษาการเขียนโปรแกรมใหม่ แต่นั่นเป็นคำเตือนครั้งแรกของคุณ!
caird coinheringaahing

คำตอบ:


11

ถ่าน , 62 43 39 ไบต์

NβF³«F⁻β‹ι²« / \¶|   |¶ \ /Mײι↑¿⁻¹ιM⁶←

ลองออนไลน์! แก้ไข: บันทึกบางไบต์ด้วย @ ASCII-only (ไม่แน่ใจว่าเท่าที่ฉันบันทึกอีก6 10 ไบต์ แต่ต้องใช้ 4 ไบต์ในการแก้ไขข้อผิดพลาด) ตอนนี้ใช้ลูปซ้อนกันซึ่งเป็นสิ่งนี้ควรได้รับตลอด


45 ไบต์: A / \¶| |¶ \ /αNβFβ«α←←»Fβ«α↖↖M⁶←»Fβ«αM⁴↑←←(btw ถ่านเติมข้อความอัตโนมัติที่จำเป็น»ในตอนท้าย)
ASCII- เท่านั้น

@ ASCII เท่านั้นน่าเสียดายที่ฉันไม่สามารถหาเอกสาร Charcoal ได้อีกดังนั้นฉันจึงไม่รู้ว่าโค้ดของคุณทำอะไร
Neil

คำสั่งอยู่บนวิกิที่นี่โดยทั่วไปAssign(hexagon_with_space_to_left, a);InputNumber(b);for(b){Print(a);Move(:Left);Move(:Left);}for(b){Print(a);Move(:UpLeft);Move(:UpLeft);Move(6, :Left);}for(b){Print(a);Move(4, :Up);Move(:Left);Move(:Left);}แต่ละคำสั่งวนซ้ำด้านเดียว
ASCII-only

คุณทำอะไรอยู่มาก แต่ด้วยการบันทึกสตริงเป็นตัวแปร
ASCII-only

@ ASCII เท่านั้นโดยการย้อนกลับทิศทางของการวาดฉันสามารถบันทึกได้อีก 2 ไบต์ (นอกจากนี้ผมผิดหวังเล็กน้อยว่าวิธีที่ดีที่สุดของการวาดรูปหกเหลี่ยมเป็นตัวอักษรสตริง แต่อย่างน้อยนี้จะทำให้มันง่ายที่จะทำซ้ำ.)
นีล

7

Python 2, 184 177 174 164 ไบต์

n=input();p='|   |';e=' \\ /'
for i in range(n):k=' '*(4*i-5);w='  '*~(i-n);print w+[' / \\'*-~i+'\n'+w+p[:4]*i+p,' /'+e+k[3:]+e+' \\\n'+w+p+k+p][2<i<n-1]
print e*n

ลองออนไลน์!

-7 ไบต์ขอบคุณØrjan Johansen


คุณหายไป|s ขวาสุดในสามอันดับแรกและแถวหกเหลี่ยมด้านล่าง
Ørjan Johansen

p[:4]*(i+2)แทนที่จะp[:4]*(i+1)ดูเหมือนว่าจะแก้ไข
Ørjan Johansen

คุณใช้bในจุดเดียวเท่านั้นดังนั้นการรวมเข้ากับ~เล่ห์เหลี่ยมของคุณw=' '*2*~(i-n)จึงสั้นลง 7 ไบต์
Ørjan Johansen

@ ØrjanJohansenขอบคุณรหัสที่ผ่านการ refactoring จำนวนมากและฉันลืมที่จะเปลี่ยนสิ่งเหล่านั้น
คณิตศาสตร์ junkie

6

JavaScript (ES6), 243 ไบต์

f=n=>(n=n*2-2,a=[...Array(n+3)].map(_=>Array(n*2+5).fill` `),g=(y,x)=>(a[y+1][x]=a[y+1][x+4]=`|`,a[y][x+1]=a[y+2][x+3]=`/`,a[y][x+3]=a[y+2][x+1]=`\\`),[...Array(n+!n)].map((_,i)=>i%2||(g(n,i*2),g(i,i=n-i),g(i,n+i))),a.map(a=>a.join``).join`
`)
<input type=number oninput=o.textContent=f(this.value)><pre id=o>


4

JavaScript (ES6), 133 129 128 126 ไบต์

สร้างอักขระเอาท์พุทโดยตัวละครที่มีสองสำหรับลูป

n=>{for(s='',y=n*2,n*=4;~y--;s+=`
`)for(x=n;~x--;)s+=' \\ /|'[x>y-2&x<n-y&(k=x+y&3,x>n-y-6|x<y+4|y<2)?y&1?k:k+1&4:0];return s}

มันทำงานอย่างไร

ในวงรอบนอกY iterates จากn * 2-1เพื่อ-1 ในวงภายในx iterates จากn * 4-1เพื่อ-1 เราตั้งค่าk = (x + y) & 3ซึ่งเป็นรูปแบบพื้นฐานที่ใช้ในการสร้างรูปหกเหลี่ยม

ด้านล่างเป็นตารางผลลัพธ์สำหรับn = 4 :

     15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0 -1
   +---------------------------------------------------
 7 |  2  1  0  3  2  1  0  3  2  1  0  3  2  1  0  3  2
 6 |  1  0  3  2  1  0  3  2  1  0  3  2  1  0  3  2  1
 5 |  0  3  2  1  0  3  2  1  0  3  2  1  0  3  2  1  0
 4 |  3  2  1  0  3  2  1  0  3  2  1  0  3  2  1  0  3
 3 |  2  1  0  3  2  1  0  3  2  1  0  3  2  1  0  3  2
 2 |  1  0  3  2  1  0  3  2  1  0  3  2  1  0  3  2  1
 1 |  0  3  2  1  0  3  2  1  0  3  2  1  0  3  2  1  0
 0 |  3  2  1  0  3  2  1  0  3  2  1  0  3  2  1  0  3
-1 |  2  1  0  3  2  1  0  3  2  1  0  3  2  1  0  3  2

บนแถวคู่เซลล์จะเต็มไปด้วยอักขระไพพ์เมื่อk = 3และเว้นวรรคเป็นอย่างอื่น ท่อเป็นตัวละครที่ 5 ในสายการอ้างอิงของเรา" \ /|"ดังนั้นดัชนีที่ถูกต้องจะได้รับจาก(k + 1) และ 4

ในแถวคี่แต่ละเซลล์จะถูกเติมด้วยอักขระที่เกี่ยวข้องโดยตรงในสตริงอ้างอิง:

  • k = 0 →ช่องว่าง
  • k = 1 → "\"
  • k = 2 →ช่องว่าง
  • k = 3 → "/"

ด้านล่างคือตัวอย่างที่อัปเดตของเรา (ช่องว่างแทนที่ด้วยจุด):

     15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0 -1
   +---------------------------------------------------
 7 |  .  \  .  /  .  \  .  /  .  \  .  /  .  \  .  /  .
 6 |  .  .  |  .  .  .  |  .  .  .  |  .  .  .  |  .  .
 5 |  .  /  .  \  .  /  .  \  .  /  .  \  .  /  .  \  .
 4 |  |  .  .  .  |  .  .  .  |  .  .  .  |  .  .  .  |
 3 |  .  \  .  /  .  \  .  /  .  \  .  /  .  \  .  /  .
 2 |  .  .  |  .  .  .  |  .  .  .  |  .  .  .  |  .  .
 1 |  .  /  .  \  .  /  .  \  .  /  .  \  .  /  .  \  .
 0 |  |  .  .  .  |  .  .  .  |  .  .  .  |  .  .  .  |
-1 |  .  \  .  /  .  \  .  /  .  \  .  /  .  \  .  /  .

ในสูตรต่อไปนี้เรากำหนดN = n * 4เพื่อให้สามารถอ่านได้ (แม้ว่าจะใช้ตัวแปรเดียวกันในรหัส)

รูปสามเหลี่ยมได้จากการทดสอบ:

  • x> y - 2 →ลบมุมขวา
  • AND x <N - y →ลบมุมซ้าย

และส่วนด้านในจะถูกลบออกโดยการทดสอบ:

  • x> N - y - 6 →เก็บเฉพาะขอบซ้าย
  • หรือx <y + 4 →รักษาขอบขวาเท่านั้น
  • หรือy <2 →เก็บเฉพาะที่ขอบด้านล่าง

การสาธิต


ไม่[x>y-2&x<n-y&(x>n-y-6|x<y+4|y<2)&&y&1?x+y&3:x-~y&4]ทำงานหรือไม่
Neil

@ Neil อืมฉันไม่คิดอย่างนั้น เราจะต้องวงเล็บรอบแสดงออก ternary และไม่ได้เป็นเช่นเดียวกับ(x+y+1)&4 (((x+y)&3)+1)&4
Arnauld

ไม่แน่นอนมันไม่ใช่ ฉันกำลังคิดอะไรอยู่ ...
นีล

3

เจลลี่ ,  62  61 ไบต์

ขณะนี้มีหกแตก

_‘<×⁸>6
Rµ‘⁾| ẋ⁾/\ẋ⁸¤ż;/K€µ⁶ðMṀ_6r6ẋð¦"Jç¥
ḤḶUẋ@€⁶;"ǵ-ịṙ6ṭ⁸Y

ลองออนไลน์!

อย่างไร?

_‘<×⁸>6 - Link 1, should we eat the praline? row number, triangle size
_       - row number minus triangle size
 ‘      - plus one
  <     - less than triangle size? (1 if one of the last rows else 0)
   ×⁸   - multiply by row number   (row number or 0)
     >6 - greater than 6?          (row number if between row 6 and last two rows)

Rµ‘⁾| ẋ⁾/\ẋ⁸¤ż;/K€µ⁶ðMṀ_6r6ẋð¦"Jç¥ - Link 2, build a solid triangle: triangle size
                                              (except the very bottom row)
R                                  - range: [1,2,...,size]
 µ                                 - monadic chain separation, call that r
  ‘                                - increment: [2,3,...,size+1]
   ⁾| <space                       - literal "| "
      ẋ                            - repeat: ["| | ","| | | ",...]
            ¤                      - nilad followed by link(s) as a nilad:
       ⁾/\                         -   literal "/\"
           ⁸                       -   link's left argument, r
          ẋ                        -   repeat (vectorises): ["/\","/\/\",...]
             ż                     - zip the two repeated lists together: [["/\","| | "],["/\/\","| | | "],...]
              ;/                   - reduce by concatenation: ["/\","| | ","/\/\","| | | ",...]
                K€                 - join with spaces for €ach: ["/ \","|   |  ","/ \ / \","|   |   |  ",...]
                  µ                - monadic chain separation call that s
                                 ¥ - last two links a a dyad:
                               J   -   range(length(s))  
                                ç  -   call the last (1) link as a dyad (left = result of J, right = size)
                              "    - zip with: (call those d)
                    ð       ð¦     -   apply to indexes:
                   ⁶               -   a literal space character
                     M             -     indexes of maximal elements in an element of s (a row)
                      Ṁ            -     maximum (this is the rightmost non-space index, MṀ working like length ignoring trailing spaces)
                       _6          -     subtract 6  (6 indexes back from the right)
                         r6        -     range from there to 6, i.e [l-6,l-7,...,6]
                           ẋ       -     repeat d times (1 or 0), thus applying to the middle rows but not the bottom and top ones.

ḤḶUẋ@€⁶;"ǵ-ịṙ6ṭ⁸Y - Main link: triangle size
Ḥ                  - double(size)
 Ḷ                 - unlength: [0,1,2,...,double(size)-1]
  U                - upend: [double(size)-1,...,2,1,0]
      ⁶            - literal space character
   ẋ@€             - repeat for €ach with reversed arguments ["  ...  ",...,"  "," ",""]
         Ç         - call the last link (2) as a monad(size)
       ;"          - zip with concatenation (zips the leading spaces with the solid triangle body)
          µ        - monadic chain separation, call that t
           -ị      - index -1 (last but one row of t)
             ṙ6    - rotate left by 6 (any number congruent to 2 mod 4 would do)
               ṭ⁸  - tack to t (add this new row on)
                 Y - join all the rows by new lines
                   - implicit print

มี>คำอธิบายที่หายไป( <space)
Roman Gräf

@ RomanGräfขอบคุณฉันแก้ไขคำอธิบาย! หากคุณหมายถึง " ใต้ช่องว่างในคำอธิบายนั้นไม่ตรง" โปรดแจ้งให้เราทราบ
Jonathan Allan


1

Mathematica, 155 ไบต์

""<>Table[If[i+j<d||i-j>d+1||i+j>d+5&&i-j<d-3&&j<d-1," ",Switch[Mod[i+d+{j,-j},4],{1,3},"/",{3,1},"\\",{1,1},"|",_," "]],{j,(d=2#)+1},{i,4#+1}]~Riffle~"\n"&

ด้วย\nแทนที่ด้วยขึ้นบรรทัดใหม่

อ่านเพิ่มเติมได้:

"" <> Table[
    If[i+j < d || i-j > d+1 || 
      i+j > d+5 && i-j < d-3 && j < d-1, " ", 
     Switch[Mod[i+d+{j,-j}, 4], {1, 3}, "/", {3, 1}, 
      "\\", {1, 1}, "|", _, " "]], {j, (d=2#)+1}, {i, 4#+1}]~
   Riffle~"\n" &

สร้างอาร์เรย์ของตัวละครจัดทำดัชนีโดยiจาก 1 ถึง 4 n + 1 ในแนวนอนและjจาก 1 ถึง 2 n + 1 ในแนวตั้ง ก่อนSwitch[Mod[i+d+{j,-j},4],{1,3},"/",{3,1},"\\",{1,1},"|",_," "]เติมในตารางหกเหลี่ยม:

 \ / \ / \ / \ / 
  |   |   |   |  
 / \ / \ / \ / \ 
|   |   |   |   |
 \ / \ / \ / \ / 
  |   |   |   |  
 / \ / \ / \ / \ 
|   |   |   |   |
 \ / \ / \ / \ / 

จากนั้นIf[i+j<d||i-j>d+1||i+j>d+5&&i-j<d-3&&j<d-1," ",...]แทนที่สิ่งนี้ด้วย" "ด้านนอกสามเหลี่ยมที่ไม่ได้กรอก

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