Segitiga Segi Enam

20

Misalkan ubin tak terbatas segi enam yang terdiri dari |/\karakter.

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

Diberikan input n > 0, output bagian segitiga dari ubin yang digambarkan dalam contoh di bawah ini, berlabuh dengan _di tengah segi enam:

n=1
\_/

n=2
\/ \/
 \_/

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

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

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

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

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

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

and so on

Aturan

  • Leading / trailing newlines atau spasi putih lainnya adalah opsional, asalkan karakternya berbaris dengan tepat.
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Keluaran bisa ke konsol, disimpan sebagai gambar, dikembalikan sebagai daftar string, dll.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
AdmBorkBork
sumber
Jika Anda menghitung jumlah titik akhir di sepanjang bagian atas hasil, Anda mendapatkan A029578 (bilangan alami disatukan dengan angka genap) dengan offset 4. 2 , 4 , 3 , 6 , 4 , 8 , 5 , 10 , 6 , 12 , 7 , 14 , ...
Engineer Toast
Apa artinya "disimpan sebagai gambar"? Apakah ini tag ascii-art?
tsh
@ tsh Untuk hal-hal seperti HyperCard atau sesuatu, di mana output ke kanvas setara dengan output "stdout". Saya tidak pilih-pilih bagaimana output ditampilkan.
AdmBorkBork

Jawaban:

8

Python 2 , 86 byte

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

Cobalah online!

Salah satu trik Erik memungkinkan saya bermain golf 3 byte! Disimpan 3 byte berkat Jonathan Allan.

Bagaimana ini bekerja?

Pertama, ini mendapat input dari STDIN dan menugaskannya ke dua variabel terpisah idan k. Kemudian, ketika variabelnya ibenar, kami menurunkannya dan menghasilkan string yang sesuai; ini adalah singkatan untuk pengulangan dari input - 1 hingga 0.

Menghasilkan String

Saya akan membagi ini menjadi lebih banyak bagian:

  • Pertama, mendapatkan jarak memimpin dicapai dengan " "*(k+~i). Karena idipetakan melalui rentang (input, 0] , kita harus mengurangkannya dari k(input asli yang disimpan dengan aman), mengurangi dan mengulangi spasi yang berkali-kali.

  • +"\\"- Menambahkan karakter "\"ke spasi di atas.

  • ' / |\ '[i%2::2]- Menghasilkan dua string kami, yaitu "/ \ "dan " | ", dengan cara berikut:

    • Jika iganjil, i% 2 adalah 1 , dengan demikian [i%2::2]mengembalikan setiap 2 karakter dari string kami yang lebih besar, mulai dari indeks 1 (0-diindeks).

    • Jika igenap, i% 2 adalah 1 , maka mekanisme di atas melakukan hal yang sama kecuali dimulai pada indeks 0 .

  • +~-i*- Mengulang string yang dihasilkan di atas, baik "/ \ "atau " | ", i-1 kali, dan menambahkannya ke string lain. Manfaat dari operator bitwise ( ~- Komplemen Bitwise, Setara dengan saya dikurangi -1 ) adalah tidak memerlukan tanda kurung dalam konteks ini.

  • [:k-~i]- Mendapat semua karakter dari string yang digabungkan di atas sampai indeks k- ~ i = k - (-1 - i) = k + 1 + i .

  • +"_/"[i>0:]- Ini hanya menambah "/"jika saya ≥ 1 , kalau tidak ditambahkan _/.

Contoh lengkap / detail eksekusi

Mari kita ambil contoh cara kerja untuk input 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.
Tuan Xcoder
sumber
Pindahkan i-=1ke awal lingkaran dan gunakan formasi sisi kanan yang sedikit berbeda untuk menurunkannya menjadi 87 byte .
Jonathan Allan
... pada kenyataannya bahkan lebih baik pada 86 byte menggunakan sesuatu seperti formasi sisi kanan Anda :)
Jonathan Allan
@ JonathanAllan ... Terima kasih! (Meskipun mengulangi penjelasannya akan ... sulit! ... menghela napas )
Tn. Xcoder
@ Jonathanathan Allan Saya menemukan alternatif yang tidak membalik urutan pernyataan penurunan nilai.
Tn. Xcoder
4

Python 2 , 90 byte

n=N=input()
while N:print' '*(n-N)+'\\'+(('/   \|  '[N%2::2]*n)[:N*2-1],'_')[N<2]+'/';N-=1

Cobalah online!

Erik the Outgolfer
sumber
2

05AB1E , 33 byte

1ŸεÐi'_ë"/ \   | "4ôsès∍}'\ì.∞}.c

Cobalah online!

Erik the Outgolfer
sumber
Cobalah online! - Mencoba mengeksploitasi pola "0300" dan "2010", tidak terlalu panas.
Magic Gurita Guci
@MagicOctopusUrn Itu tidak mencetak garis bawah juga: p
Erik the Outgolfer
2

Mathematica, 131 byte

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


mengembalikan daftar string

Cobalah online!

J42161217
sumber
2

Retina , 129 119 112 byte

\d+
$* 
 
¶$`a $'$' 
m`$
/
  /$
_/
^.¶

a(    )*/
a$#1/
\d+
$*
1
/ a  
 (    )*/
$#1/
\d+
$*
1
 |  
a /¶
a/¶
a
\

Cobalah online!

ovs
sumber
2

Arang , 26 byte

NθG↖→↓θ“ ″✂=AL«Q"η\`”←_↖θ‖B

Cobalah online! Tautan adalah untuk mengucapkan versi kode.

Neil
sumber
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

Cobalah online!

  • Menyimpan banyak byte dengan menggunakan input dan pemformatan string seperti pada jawaban Rod
  • Disimpan 2 byte berkat Tn. Xcoder
TFeld
sumber
1
Anda dapat menyimpan 2 byte dengan mengganti -1-adengan ~a(seperti yang saya lakukan dalam jawaban saya).
Tn. Xcoder
@ Mr.Xcoder Terima kasih :)
TFeld
1

Python 2 , 103 byte

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

Cobalah online!

tongkat
sumber
1

APL (Dyalog) , 97 93 byte

{⍵=1:1 3'\_/'x' ',' ',⍨∇⍵-1y1+2×⍵-12|⍵:x⍪⍨'\','/',⍨y⍴'  | '⋄x⍪⍨'\/','\/',⍨(y-2)⍴' \ /'}

Cobalah online!

Uriel
sumber
1

Haskell , 96 95 byte

f n=[([1..n-x]>>" ")++'\\':take(2*x+1)(cycle$("_":a)!!x)++"/"|x<-[n,n-1..0]]
a="/ \\ ":"  | ":a

Cobalah online!

0-diindeks dan mengembalikan daftar garis.

Laikoni
sumber
0

Haskell, 101 99 byte

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

Mengembalikan daftar garis.

Cobalah online!

Bagaimana itu bekerja:

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

Sunting: @Laikoni menyimpan dua byte. Terima kasih!

nimi
sumber
([1,3..n-1]>>)bisa digunakan sebagai ganti ([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;}

Cobalah online!

Roberto Graham
sumber
0

Java (OpenJDK 8) , 198 byte

Akhirnya mendapatkannya di bawah 200 byte. Mungkin akan memposting penjelasan nanti.

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?"_/":"/")));}

Cobalah online!

Luke Stevens
sumber
0

JavaScript (ES6), 89 85 byte

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

Demo

Arnauld
sumber
0

CJam, 43

ri_{S*'\@(:X"  | / \ "4/=X*X2*)<'_e|'/NX}/;

Cobalah online

aditsu
sumber
0

PHP, 89 +1 byte

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

Jalankan sebagai pipa dengan -nRatau coba online .

Titus
sumber
0

Pyth ,  46  44 byte

j_m+<++*;t-Qd\\*d%2>" /  |\  "%d2h+Qd>"_/"._

Coba di sini!

Tuan Xcoder
sumber