Tam giác hình lục giác


20

Giả sử một lát xếp vô hạn của các hình lục giác gồm các |/\ký tự.

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

Cho đầu vào n > 0, xuất ra một phần hình tam giác của ốp đó như được mô tả trong các ví dụ dưới đây, được neo với _một hình lục giác ở giữa:

n=1
\_/

n=2
\/ \/
 \_/

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

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

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

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

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

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

and so on

Quy tắc

  • Dòng mới hàng đầu / dấu hoặc khoảng trắng khác là tùy chọn, miễn là các ký tự xếp hàng một cách thích hợp.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Đầu ra có thể là bàn điều khiển, được lưu dưới dạng hình ảnh, được trả về dưới dạng danh sách các chuỗi, v.v.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là để áp dụng tất cả các quy tắc chơi golf thông thường và mã ngắn nhất (tính bằng byte) sẽ thắng.

Nếu bạn đếm số điểm kết thúc dọc theo đỉnh của kết quả, bạn sẽ nhận được A029578 (các số tự nhiên xen kẽ với các số chẵn) với độ lệch là 4. 2 , 4 , 3 , 6 , 4 , 8 , 5 , 10 , 6 , 12 , 7 , 14 , ...
Kỹ sư nướng bánh mì

"Lưu dưới dạng hình ảnh" nghĩa là gì? cái này được gắn thẻ ascii-art?
tsh

@tsh Đối với những thứ như HyperCard hoặc một cái gì đó, trong đó đầu ra cho một khung vẽ tương đương với đầu ra "xuất chuẩn" của chúng. Tôi không kén chọn cách hiển thị đầu ra.
admBorkBork

Câu trả lời:


8

Python 2 , 86 byte

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

Hãy thử trực tuyến!

Một trong những thủ thuật của Erik cho phép tôi chơi gôn 3 byte! Lưu được 3 byte nhờ Jonathan Allan.

Làm thế nào điều này hoạt động

Trước hết, điều này nhận đầu vào từ STDIN và gán nó cho hai biến riêng biệt ik. Sau đó, trong khi biếni là trung thực, chúng tôi giải mã nó và tạo các chuỗi tương ứng; đây là một tốc ký để lặp từ đầu vào - 1 xuống đến 0.

Tạo chuỗi

Tôi sẽ chia phần này thành nhiều phần hơn:

  • Trước hết, có được khoảng cách hàng đầu là đạt được với " "*(k+~i). Vì iđược ánh xạ qua phạm vi (đầu vào, 0] , chúng tôi phải trừ nó khỏik (đầu vào ban đầu được lưu trữ an toàn của chúng tôi), giảm dần và lặp lại một không gian nhiều lần.

  • +"\\" - Thêm nhân vật "\" vào khoảng trắng ở trên.

  • ' / |\ '[i%2::2]- Tạo hai chuỗi của chúng tôi, cụ thể là "/ \ "" | " , theo cách sau:

    • Nếu ilà số lẻ, i% 21 , do đó [i%2::2]trả về mỗi 2 ký tự của chuỗi lớn hơn của chúng tôi, bắt đầu từ chỉ mục 1 (được lập chỉ mục 0).

    • Nếu ilà chẵn, i% 21 , do đó cơ chế ở trên thực hiện tương tự ngoại trừ nó bắt đầu ở chỉ số 0 .

  • +~-i*- Lặp lại chuỗi được tạo ở trên, "/ \ "hoặc " | ", i-1 lần và nối nó với các chuỗi khác. Lợi ích của toán tử bitwise ( ~- Bổ sung bitwise , tương đương với i được trừ từ -1 ) là nó không yêu cầu dấu ngoặc trong ngữ cảnh này.

  • [:k-~i]- Nhận tất cả các ký tự của các chuỗi được nối ở trên cho đến khi chỉ số k- ~ i = k - (-1 - i) = k + 1 + i .

  • +"_/"[i>0:]- Điều này chỉ thêm "/"nếu tôi 1 , nếu không nó sẽ bổ sung _/.

Ví dụ đầy đủ / chi tiết thực hiện

Hãy lấy một ví dụ về cách mọi thứ hoạt động với đầu vào là 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.

Di chuyển i-=1đến điểm bắt đầu của vòng lặp và sử dụng một đội hình bên tay phải hơi khác để giảm xuống còn 87 byte .
Jonathan Allan

... trên thực tế thậm chí còn tốt hơn với 86 byte bằng cách sử dụng thứ gì đó như đội hình bên tay phải của bạn :)
Jonathan Allan

@Jonathan ALLan ... Cảm ơn! (Mặc dù làm lại lời giải thích sẽ ... khó khăn! ... thở dài )
Ông Xcoder

@Jonathan ALLan Tôi tìm thấy một giải pháp thay thế không đảo ngược thứ tự của tuyên bố giảm dần.
Ông Xcoder



2

Toán học, 131 byte

Join[Table[s=StringRiffle@Table[If[OddQ@i,"/ \\"," | "],⌈i/2⌉];""<>{"\\",If[!OddQ@i,{" ",s," "},s],"/"},{i,#-1,1,-1}],{"\_/"}]&   


trả về một danh sách các chuỗi

Hãy thử trực tuyến!




2

Python 2 , 123 112 110 109 100 98 96 byte

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

Hãy thử trực tuyến!

  • Đã lưu một loạt byte bằng cách sử dụng định dạng đầu vào và chuỗi như trong câu trả lời của Rod
  • Đã lưu 2 byte nhờ Mr. Xcoder

1
Bạn có thể lưu 2 byte bằng cách thay thế -1-abằng ~a(như tôi đã làm trong câu trả lời của mình).
Ông Xcoder

@ Mr.Xcoder Cảm ơn :)
TFeld





0

Haskell, 101 99 byte

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

Trả về một danh sách các dòng.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động:

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

Chỉnh sửa: @Laikoni lưu hai byte. Cảm ơn!


([1,3..n-1]>>)có thể được sử dụng thay thế ([1..div n 2]>>).
Laikoni

0

Java (OpenJDK 8) , 315 306 byte

i->{String r="";int j=0,k,u=i*2;char[][]c=new char[i][u+1];c[i-1][i]=95;for(;j<i;r+="".valueOf(c[j++]).replace('\0',' ')+"\n")for(k=0;k<u+1;k++){if(k==j)c[j][k]=92;if(k==u-j)c[j][k]=47;if(k>j&k<u-j)if((i-j)%2<1)c[j][k]=(k-j-1)%2<1?(char)(47+((k-j-1)/2)%2*45):32;else if((k-j-1)%4==2)c[j][k]='|';}return r;}

Hãy thử trực tuyến!


0

Java (OpenJDK 8) , 198 byte

Cuối cùng đã nhận được nó dưới 200 byte. Có lẽ sẽ gửi một lời giải thích sau.

i->{for(int k=i+1;i>0;System.out.println(("".format("%"+(k-i)+"s","")+"\\"+(i<2?"":"".format("%"+(i-1)+"s","")).replace(" ","/ \\ ,  | ".split(",")[i%2])).substring(0,i<2?k:k+i)+(--i<1?"_/":"/")));}

Hãy thử trực tuyến!


0

JavaScript (ES6), 89 85 byte

f=(y,s='\\')=>--y?s+(y&1?' / \\':' |  ').repeat(y).slice(~y-y)+`/
`+f(y,' '+s):s+'_/'

Bản giới thiệu



0

PHP, 89 + 1 byte

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

Chạy như ống với -nRhoặc thử trực tuyến .


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.