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


20

สมมติว่าการเรียงต่อกันของ hexagons ประกอบด้วย|/\อักขระ

 / \ / \ / \ / \
|   |   |   |   |
 \ / \ / \ / \ /  etc.
  |   |   |   |
   \ / \ / \ /

ป.ร. ให้n > 0ไว้เอาท์พุทส่วนที่เป็นรูปสามเหลี่ยมของกระเบื้องที่แสดงในตัวอย่างด้านล่างยึดด้วย_ในช่วงกลางของหกเหลี่ยม:

n=1
\_/

n=2
\/ \/
 \_/

n=3
\  |  /
 \/ \/
  \_/

n=4
\/ \ / \/
 \  |  /
  \/ \/
   \_/

n=5
\  |   |  /
 \/ \ / \/
  \  |  /
   \/ \/
    \_/

n=6
\/ \ / \ / \/
 \  |   |  /
  \/ \ / \/
   \  |  /
    \/ \/
     \_/

n=7
\  |   |   |  /
 \/ \ / \ / \/
  \  |   |  /
   \/ \ / \/
    \  |  /
     \/ \/
      \_/

n=8
\/ \ / \ / \ / \/
 \  |   |   |  /
  \/ \ / \ / \/
   \  |   |  /
    \/ \ / \/
     \  |  /
      \/ \/
       \_/

and so on

กฎระเบียบ

  • ขึ้นบรรทัดใหม่ / ต่อท้ายหรือช่องว่างอื่น ๆ เป็นตัวเลือกโดยมีเงื่อนไขว่าตัวอักษรอยู่ในแนวที่เหมาะสม
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • เอาต์พุตสามารถไปที่คอนโซลบันทึกเป็นรูปภาพส่งคืนเป็นรายการสตริง ฯลฯ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการตีกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

ถ้าคุณนับจำนวนจุดสิ้นสุดที่ด้านบนของผลที่คุณจะได้รับA029578 (หมายเลขธรรมชาติบรรณนิทัศน์กับเลขคู่) ที่มีการชดเชยจาก 4 2 , 4 , 3 , 6 , 4 , 8 , 5 , 10 , 6 , 12 , 7 , 14 , ...
Engineer Toast

"บันทึกเป็นรูปภาพ" หมายถึงอะไร นี่คือแท็ก ASCII-art หรือไม่
tsh

@tsh สำหรับสิ่งต่าง ๆ เช่น HyperCard หรือบางสิ่งบางอย่างที่เอาท์พุทไปยังผืนผ้าใบเทียบเท่ากับเอาต์พุต "stdout" ฉันไม่จู้จี้จุกจิกกับวิธีการแสดงผล
AdmBorkBork

คำตอบ:


8

Python 2 , 86 ไบต์

i=k=input()
while i:i-=1;print(" "*(k+~i)+"\\"+i*' /  |\  '[i%2::2])[:k-~i]+"_/"[i>0:]

ลองออนไลน์!

หนึ่งในกลอุบายของ Erik ทำให้ฉันตีกอล์ฟได้ 3 ไบต์! บันทึก 3 ไบต์ขอบคุณ Jonathan Allan

วิธีนี้ใช้ได้ผล

ปิดครั้งแรกนี้ได้รับข้อมูลจาก STDIN และกำหนดให้กับตัวแปรทั้งสองแยกจากกันและi kจากนั้นในขณะที่ตัวแปรiนั้นเป็นความจริงเราจะลดลงและสร้างสตริงตามนั้น นี่เป็นชวเลขสำหรับการวนลูปจากอินพุต - 1 จนถึง 0

การสร้างสตริง

ฉันจะแยกส่วนนี้ออกเป็นส่วน ๆ เพิ่มเติม:

  • " "*(k+~i)ปิดแรกเริ่มระยะห่างชั้นนำจะประสบความสำเร็จกับ เนื่องจากiมีการแมปผ่านช่วง(อินพุต, 0]เราจะต้องลบมันออกจากk(อินพุตดั้งเดิมของเราที่เก็บไว้อย่างปลอดภัย) การลดลงและทำซ้ำพื้นที่ที่ซ้ำหลายครั้ง

  • +"\\"- เพิ่มอักขระ"\"ลงในช่องว่างด้านบน

  • ' / |\ '[i%2::2]- สร้างสองสายของเราคือ"/ \ "และ" | "ในลักษณะดังต่อไปนี้:

    • หากiเป็นเลขคี่i% 2คือ1ดังนั้น[i%2::2]จะส่งคืนอักขระ 2 ตัวของสตริงที่มีขนาดใหญ่กว่าของเราเริ่มต้นที่ดัชนี1 ( ดัชนี0)

    • ถ้าiเป็นแม้กระทั่ง% ฉัน 2เป็น1ดังนั้นกลไกดังกล่าวข้างต้นไม่เหมือนกันยกเว้นว่ามันจะเริ่มต้นที่ดัชนี0

  • +~-i*- ซ้ำสตริงที่สร้างขึ้นดังกล่าวข้างต้นอย่างใดอย่างหนึ่ง"/ \ "หรือ" | ", I-1ครั้งและผนวกไปยังสายอื่น ๆ ประโยชน์ของผู้ประกอบการระดับบิต ( ~- ส่วนเสริม Bitwise เทียบเท่ากับiลบจาก-1 ) คือมันไม่จำเป็นต้องใช้วงเล็บในบริบทนี้

  • [:k-~i]- ได้รับทุกตัวอักษรของสตริงตัดแบ่งข้างต้นจนกว่าดัชนีK- ~ i = k - (-1 - i) = k + 1 + i

  • +"_/"[i>0:]- นี้เท่านั้นที่จะเพิ่ม"/"ถ้าฉัน≥ 1 , _/อื่นมันผนวก

ตัวอย่าง / รายละเอียดการดำเนินการเต็มรูปแบบ

ลองมาดูตัวอย่างของการทำงานของอินพุต4 :

i=k=input()        # i and k are assigned to 4.
while i:           # Starts the loop. The initial value of i is 4.
i-=1;              # Decrement i. i is now 3.
" "*(k+~i)         # A space repeated k - 1 - i = 4 - 1 - 3 = 0 times.
+"\\"              # Plus the character "\". CS (Current string): "\".
' /  |\  '[i%2::2] # The string ' /  |\  '[3%2::2] = ' /  |\  '[1::2] = "/ \ ".
i*                 # ^ repeated i = 3 times: "/ \ / \ / \ ".
+                  # And concatenate. CS: "\/ \ / \ / \ "
[:k-~i]            # Get the characters of ^ up to index k + 1 + i = 4 + 1 + 3 = 8.
                   # CS: "\/ \ / \".
+"_/"[i>0:]        # Append "_/"[i>0:] = "_/"[3>0:] = "_/"[1:] = "/".
                   # CS: "\/ \ / \/".
print              # Output the result "\/ \ / \/".
while i:           # i is truthy (> 0), thus we loop again.
i-=1;              # Decrement i. i becomes 2.
" "*(k+~i)         # " " repeated 4 - 2 - 1 = 1 time. 
+"\\"              # Plus "\". CS: " \".
' /  |\  '[i%2::2] # ' /  |\  '[2%2::2] = ' /  |\  '[::2] = "  | ".
+i*                # Repeat i = 2 times and append: "  | ". CS: " \  |  |".
[:k-~i]            # CS up until k + 1 + i = 4 + 2 + 1 = 7. CS: " \  |  ".
+"_/"[i>0:]        # Append "/". CS: " \  |  /".
print              # Outputs the CS: " \  |  /".
while i:           # i is truthy (> 0), thus we loop again.
i-=1;              # Decrement i. i is now 1.
" "*(k+~i)         # " " repeated 4 - 1 - 1 = 2 times. 
+"\\"              # Plus "\". CS: "  \".
' /  |\  '[i%2::2] # ' /  |\  '[2%2::2] = ' /  |\  '[::2] = "/ \ ".
+i*                # Repeat i = 1 time and append: "/ \ ". CS: "  \/ \ ".
[:k-~i]            # CS up until k + i + 1 = 4 + 2 = 6. CS: "  \/ \".
+"_/"[i>0:]        # Append "/". CS: "  \/ \/".
print              # Outputs the CS: "  \/ \/".
while i:           # i is truthy (> 0), thus we loop again.
i-=1;              # Decrement i. i is now 0.
" "*(k+~i)         # " " repeated 4 - 1 - 0 = 3 times. 
+"\\"              # Plus "\". CS: "   \".
' /  |\  '[i%2::2] # ' /  |\  '[1%2::2] = ' /  |\  '[1::2] = "  | ".
+i*                # Repeat i = 0 times and append: "   \". CS: "   \".
[:k-~i]            # CS up until k + i + 1 = 4 + 0 + 1 = 5. CS: "   \".
+"_/"[i>0:]        # Append "_/" (because i > 0 is False since i == 0). CS: "  \_/".
print              # Outputs the CS: "  \_/".
while i:           # i == 0, hence the condition is falsy and the loop ends. 
                   # Program terminates.

ย้ายi-=1ไปยังจุดเริ่มต้นของวงและใช้ก่อขวามือด้านแตกต่างกันเล็กน้อยที่จะได้รับมันลงไป87 ไบต์
Jonathan Allan

... ในความเป็นจริงที่ดียิ่งขึ้นใน86 ไบต์ใช้สิ่งที่ต้องการของคุณก่อขวามือด้าน :)
โจนาธานอัลลัน

@JanathanAllan ... ขอบคุณ! (แม้ว่าการทำซ้ำคำอธิบายจะเป็น ... แกร่ง! ... ถอนหายใจ )
Mr. Xcoder

@JanathanAllan ฉันพบทางเลือกที่ไม่กลับลำดับของข้อความสั่งการลดลง
Mr. Xcoder






2

Python 2 , 123 112 110 109 100 98 96 ไบต์

i=n=input()
while i:a=i%2;print' '*(n-i)+'\%s/'%['_',((-~i/2)*'/   \  |'[a::2])[a:~a]][i>1];i-=1

ลองออนไลน์!

  • บันทึกจำนวนไบต์โดยใช้รูปแบบอินพุตและสตริงเหมือนใน คำตอบของ Rod
  • บันทึก 2 ไบต์ต้องขอบคุณ Mr. Xcoder

1
คุณสามารถบันทึก 2 ไบต์โดยแทนที่-1-aด้วย~a(เหมือนที่ฉันทำในคำตอบของฉัน)
Mr. Xcoder

@ Mr.Xcoder ขอบคุณ :)
TFeld





0

Haskell, 101 99 ไบต์

j 1=["\\_/"]
j n|r<-([1,3..n-1]>>)=('\\':cycle[init$r"/ \\ ",' ':r" |  "]!!n++"/"):map(' ':)(j$n-1)

ส่งคืนรายการบรรทัด

ลองออนไลน์!

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

j 1=["\\_/"]               -- base case, n=1

j n                        -- for all other n
   |r<-([1,3..n-1]>>)      -- let r be the function that makes n/2 copies of
                           -- it's argument
   =                       -- the result is
      '\\':                --  a backslash, followed by
      cycle[  ]!!n         --  the inner part, which is
          init$r"/ \\ "    --    all but the last char of some copies of
                           --    "/ \ " for even line numbers, or
          ' ':r" |  "      --    some copies of " |  " prepended by a space
                           --    for odd line numbers
                           --    (chosen by indexing an infinite list of
                           --     both values alternating)   
      ++"/"                --  followed by a slash
    :                      --  and append a
               j$n-1        --  recursive call with n-1
      map(' ':)            --  where each line is prepended by a space

แก้ไข: @Laikoni บันทึกสองไบต์ ขอบคุณ!


([1,3..n-1]>>)([1..div n 2]>>)สามารถนำมาใช้แทน
Laikoni





0

PHP, 89 + 1 ไบต์

while($k=$argn-$n)echo($p=str_pad)("",$n++),$p("\\",2*$k,$k>1?$k&1?"  | ":"/ \ ":_),"/
";

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์


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