Triangoli di esagoni


20

Supponiamo che una piastrellatura infinita di esagoni sia composta da |/\personaggi.

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

Dato input n > 0, emette una porzione triangolare di quella piastrellatura come illustrato negli esempi seguenti, ancorato con una _al centro di un esagono:

n=1
\_/

n=2
\/ \/
 \_/

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

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

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

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

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

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

and so on

Regole

  • Le linee guida iniziali / finali o altri spazi bianchi sono opzionali, a condizione che i caratteri siano allineati in modo appropriato.
  • È accettabile un programma completo o una funzione. Se una funzione, è possibile restituire l'output anziché stamparlo.
  • L'output può essere sulla console, salvato come immagine, restituito come un elenco di stringhe, ecc.
  • Sono vietate le scappatoie standard .
  • Si tratta di quindi si applicano tutte le normali regole del golf e vince il codice più breve (in byte).

Se contate il numero di punti finali nella parte superiore del risultato, otterrete A029578 (i numeri naturali interlacciati con i numeri pari) con un offset di 4. 2 , 4 , 3 , 6 , 4 , 8 , 5 , 10 , 6 , 12 , 7 , 14 , ...
Ingegnere Toast,

Che cosa significa "salvato come immagine"? è questo taggato ascii-art?
TSH

@tsh Per cose come HyperCard o qualcosa del genere, in cui l'output su una tela equivale all'output "stdout". Non sono esigente su come viene visualizzato l'output.
AdmBorkBork,

Risposte:


8

Python 2 , 86 byte

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

Provalo online!

Uno dei trucchi di Erik mi ha permesso di giocare a golf a 3 byte! Salvato 3 byte grazie a Jonathan Allan.

Come funziona

Prima di tutto, questo riceve input da STDIN e lo assegna a due variabili separate ie k. Quindi, mentre la variabile iè vera, la diminuiamo e generiamo le stringhe di conseguenza; questa è una scorciatoia per il looping dall'ingresso - 1 fino a 0.

Generare le stringhe

Dividerò questo in più parti:

  • Prima di tutto, si ottiene la spaziatura principale con " "*(k+~i). Dal momento che iè mappato attraverso l'intervallo (input, 0] , dobbiamo sottrarlo da k(il nostro input originale memorizzato in modo sicuro), decrementare e ripetere uno spazio che molte volte.

  • +"\\"- Aggiunge il personaggio "\"agli spazi sopra.

  • ' / |\ '[i%2::2]- Genera le nostre due stringhe, ovvero "/ \ "e " | ", nel modo seguente:

    • Se iè dispari, i% 2 è 1 , quindi [i%2::2]restituisce ogni 2 caratteri della nostra stringa più grande, a partire dall'indice 1 ( indice 0).

    • Se iè pari, i% 2 è 1 , quindi il meccanismo sopra fa lo stesso tranne che inizia dall'indice 0 .

  • +~-i*- Ripete la stringa generata sopra, o "/ \ "o " | ", i-1 volte, e la aggiunge alle altre stringhe. Il vantaggio dell'operatore bit a bit ( ~- Complemento a bit , equivalente a i sottratto da -1 ) è che non richiede parentesi in questo contesto.

  • [:k-~i]- Ottiene tutti i caratteri delle stringhe concatenati sopra fino all'indice k- ~ i = k - (-1 - i) = k + 1 + i .

  • +"_/"[i>0:]- Questo si aggiunge solo "/"se ≥ 1 , altrimenti si aggiunge _/.

Esempio completo / dettagli di esecuzione

Facciamo un esempio di come funzionano le cose per un input di 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.

Spostare i-=1all'inizio del loop e utilizzare una formazione leggermente diversa sul lato destro per ridurlo a 87 byte .
Jonathan Allan,

... in effetti ancora meglio a 86 byte usando qualcosa come la tua formazione sul lato destro :)
Jonathan Allan,

@JonathanAllan ... Grazie! (Anche se rifare la spiegazione sarà ... difficile! ... sospiro )
Mr. Xcoder,

@JonathanAllan Ho trovato un'alternativa che non inverte l'ordine della dichiarazione di decremento.
Mr. Xcoder,



2

Mathematica, 131 byte

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


restituisce un elenco di stringhe

Provalo online!


2

Retina , 129 119 112 byte

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

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

Provalo online!


2

Carbone , 26 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice.


2

Python 2 , 123 112 110 109 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

Provalo online!

  • Ho salvato un sacco di byte usando l'input e la formattazione della stringa come nella risposta di Rod
  • Salvato 2 byte grazie a Mr. Xcoder

1
Puoi salvare 2 byte sostituendoli -1-acon ~a(come ho fatto nella mia risposta).
Mr. Xcoder,

@ Grazie Mr.Xcoder :)
TFeld


1

APL (Dyalog) , 97 93 byte

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

Provalo online!



1

Haskell , 96 95 byte

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

Provalo online!

0 indicizzato e restituisce un elenco di righe.


0

Haskell, 101 99 byte

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

Restituisce un elenco di righe.

Provalo online!

Come funziona:

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

Modifica: @Laikoni ha salvato due byte. Grazie!


([1,3..n-1]>>)può essere usato al posto di ([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;}

Provalo online!


0

Java (OpenJDK 8) , 198 byte

Finalmente è arrivato sotto i 200 byte. Probabilmente pubblicherà una spiegazione in seguito.

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

Provalo online!


0

JavaScript (ES6), 89 85 byte

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

dimostrazione



0

PHP, 89 + 1 byte

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

Esegui come pipe -nRo provalo online .


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.