Altıgen yanarak bahislerin doğru üçgenler


20

|/\Karakterlerden oluşan altıgenlerin sonsuz bir döşemesini varsayalım .

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

Girdi verildiğinde n > 0, aşağıdaki örneklerde gösterildiği gibi döşemenin üçgen bir bölümünü çıktısıyla _altıgenin ortasındaki a ile bağlantılı :

n=1
\_/

n=2
\/ \/
 \_/

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

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

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

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

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

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

and so on

kurallar

  • Karakterlerin uygun şekilde hizalanması şartıyla, öndeki / sondaki yeni satırlar veya diğer boşluklar isteğe bağlıdır.
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine döndürebilirsiniz.
  • Çıktı konsola olabilir, görüntü olarak kaydedilebilir, dizeler listesi olarak döndürülebilir, vb.
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Sonucun üstündeki bitiş noktası sayısını sayarsanız , 4 ofseti ile A029578 (çift sayılarla serpiştirilmiş doğal sayılar) elde edersiniz . 2 , 4 , 3 , 6 , 4 , 8 , 5 , 10 , 6 , 12 , 7 , 14 , ...
Mühendis Tost

"Görüntü olarak kaydedildi" ne anlama geliyor? bu ascii-art olarak etiketlendi mi?
tsh

@tsh Tuval üzerine çıktının "stdout" çıktısına eşdeğer olduğu HyperCard ya da benzeri bir şey için. Çıktının nasıl görüntülendiğine dair seçici değilim .
AdmBorkBork

Yanıtlar:


8

Python 2 , 86 bayt

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

Çevrimiçi deneyin!

Erik'in numaralarından biri 3 bayt golf yapmama izin verdi! Jonathan Allan sayesinde 3 bayt kurtardı.

Bu nasıl çalışır?

Öncelikle, bu STDIN ve iki ayrı değişkenlere o atar girdi alır ive k. Sonra, değişken idoğruyken, onu azaltırız ve dizeleri buna göre üretiriz; bu giriş - 1'den 0'a kadar döngü için bir kısayol.

Dizeleri Oluşturma

Bunu daha fazla parçaya ayıracağım:

  • Öncelikle, önde gelen aralığın elde edilmesi ile elde edilir " "*(k+~i). Yana iaralık yoluyla eşleştirilir (giriş, 0] , biz onu çıkarmak gerekir k(bizim güvenle saklanan orijinal giriş), eksiltme ve birçok kez bir adayı tekrarlayın.

  • +"\\"- Karakteri "\"yukarıdaki boşluklara ekler .

  • ' / |\ '[i%2::2]- yani bizim iki dizeleri, üretir "/ \ "ve " | "aşağıdaki şekilde:

    • Eğer igarip, ben% 2 olan 1 böylece [i%2::2]endeks başlayarak bizim büyük dize her 2 karakter döndürür 1 (0 endeksli).

    • Eğer idaha olduğunu, % i 2 olduğu 1 endekslemesi başlar dışında aynı yapar, böylece mekanizma, yukarıdaki 0 .

  • +~-i*- dize Yukarıda oluşturulan yinelenir ya "/ \ "ya " | ", i-1 kez ve diğer dizeleri bunu ekler. Bitsel operatörün ( ~- Bitwise Complement, -1'den çıkartılan i'ye eşdeğer) avantajı, bu bağlamda parantez gerektirmemesidir.

  • [:k-~i]- k-~ i = k - (-1 - i) = k + 1 + i dizinine kadar yukarıda birleştirilmiş dizelerin tüm karakterlerini alır .

  • +"_/"[i>0:]- Bu sadece i ≥ 1"/" ise eklenir , aksi takdirde eklenir ._/

Tüm örnek / yürütme ayrıntıları

4 girdisi için işlerin nasıl çalıştığına dair bir örnek alalım :

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.

Taşı i-=1döngünün başlangıcına ve onu oradan indirmek için biraz daha farklı bir sağ tarafı oluşumunu kullanmak 87 bayt .
Jonathan Allan

... aslında sağ taraftaki formasyonunuz gibi bir şey kullanarak 86 baytta daha da iyi :)
Jonathan Allan

@JonathanAllan ... Teşekkürler! (! Açıklamayı yineleme ... zor olacak olsa da ... sigh )
Sayın Xcoder

@JonathanAllan Decrement ifadesinin sırasını tersine çevirmeyen bir alternatif buldum .
Bay Xcoder



2

Mathematica, 131 bayt

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


bir dize listesi döndürür

Çevrimiçi deneyin!




2

Piton 2 , 123 112 110 109 100 98 96 bayt

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

Çevrimiçi deneyin!

  • Rod yanıtında olduğu gibi girdi ve dize biçimlendirmesini kullanarak bir grup bayt kaydetti
  • Bay Xcoder sayesinde 2 bayt tasarruf etti

1
Sen değiştirerek 2 bayt kaydedebilirsiniz -1-aile ~a(benim cevap olduğu gibi).
Bay Xcoder

@ Mr.Xcoder Teşekkürler :)
TFeld





0

Haskell, 101 99 bayt

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

Bir satır listesi döndürür.

Çevrimiçi deneyin!

Nasıl çalışır:

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

Düzenleme: @Laikoni iki bayt kaydetti. Teşekkürler!


([1,3..n-1]>>)yerine kullanılabilir ([1..div n 2]>>).
Laikoni

0

Java (OpenJDK 8) , 315 306 bayt

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;}

Çevrimiçi deneyin!


0

Java (OpenJDK 8) , 198 bayt

Sonunda 200 baytın altına aldı. Muhtemelen daha sonra bir açıklama gönderecek.

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

Çevrimiçi deneyin!


0

JavaScript (ES6), 89 85 bayt

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

gösteri



0

PHP, 89 + 1 bayt

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

Pipo ile çalıştırın -nRveya çevrimiçi deneyin .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.