Triangles d'hexagones

20

Supposons un pavage infini d'hexagones composés de |/\caractères.

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

Étant donné l'entrée n > 0, sortez une partie triangulaire de ce pavage comme illustré dans les exemples ci-dessous, ancrée avec un _au milieu d'un hexagone:

n=1
\_/

n=2
\/ \/
 \_/

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

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

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

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

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

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

and so on

Règles

  • Les sauts de ligne de début / fin ou d'autres espaces sont facultatifs, à condition que les caractères s'alignent correctement.
  • Un programme complet ou une fonction sont acceptables. S'il s'agit d'une fonction, vous pouvez renvoyer la sortie plutôt que de l'imprimer.
  • La sortie peut être vers la console, enregistrée sous forme d'image, renvoyée sous forme de liste de chaînes, etc.
  • Les failles standard sont interdites.
  • Il s'agit de donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) gagne.
AdmBorkBork
la source
Si vous comptez le nombre de points de fin en haut du résultat, vous obtenez A029578 (les nombres naturels entrelacés avec les nombres pairs) avec un décalage de 4. 2 , 4 , 3 , 6 , 4 , 8 , 5 , 10 , 6 , 12 , 7 , 14 , ...
Engineer Toast
Que signifie «enregistré en tant qu'image»? est-ce étiqueté ascii-art?
tsh
@tsh Pour des choses comme HyperCard ou quelque chose, où la sortie sur un canevas est leur équivalent de sortie "stdout". Je ne suis pas difficile sur la façon dont la sortie est affichée.
AdmBorkBork

Réponses:

8

Python 2 , 86 octets

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

Essayez-le en ligne!

Une des astuces d'Erik m'a permis de jouer au golf 3 octets! Enregistré 3 octets grâce à Jonathan Allan.

Comment ça marche

Tout d'abord, cela obtient l'entrée de STDIN et l'affecte à deux variables distinctes iet k. Ensuite, alors que la variable iest véridique, nous la décrémentons et générons les chaînes en conséquence; il s'agit d'un raccourci pour boucler depuis l'entrée - 1 jusqu'à 0.

Générer les cordes

Je vais diviser cela en plusieurs parties:

  • Tout d'abord, obtenir l'espacement de tête est obtenu avec " "*(k+~i). Puisque iest mappé à travers la plage (entrée, 0] , nous devons la soustraire de k(notre entrée d'origine stockée en toute sécurité), décrémenter et répéter un espace autant de fois.

  • +"\\"- Ajoute le caractère "\"aux espaces ci-dessus.

  • ' / |\ '[i%2::2]- Génère nos deux chaînes, à savoir "/ \ "et " | ", de la manière suivante:

    • Si iest impair, i% 2 est 1 , [i%2::2]renvoie donc chacun des 2 caractères de notre plus grande chaîne, en commençant à l'index 1 (indexé 0).

    • Si iest pair, i% 2 est 1 , donc le mécanisme ci-dessus fait de même sauf qu'il commence à l'index 0 .

  • +~-i*- Répète la chaîne générée ci-dessus, soit "/ \ "ou " | ", i-1 fois, et l'ajoute aux autres chaînes. L'avantage de l'opérateur au ~niveau du bit ( - Complément au niveau du bit, équivalent à i soustrait de -1 ) est qu'il ne nécessite pas de parenthèses dans ce contexte.

  • [:k-~i]- Obtient tous les caractères des chaînes concaténées ci-dessus jusqu'à ce que l'index k- ~ i = k - (-1 - i) = k + 1 + i .

  • +"_/"[i>0:]- Cela n'ajoute que "/"si i ≥ 1 , sinon il s'ajoute _/.

Exemple complet / détails d'exécution

Prenons un exemple de la façon dont les choses fonctionnent pour une entrée de 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.
M. Xcoder
la source
Déplacez le i-=1au début de la boucle et utilisez une formation de droite légèrement différente pour la réduire à 87 octets .
Jonathan Allan
... en fait encore mieux à 86 octets en utilisant quelque chose comme votre formation de droite :)
Jonathan Allan
@JonathanAllan ... Merci! (Bien que refaire l'explication sera ... difficile! ... soupir )
M. Xcoder
@JonathanAllan J'ai trouvé une alternative qui n'inverse pas l'ordre de l'instruction de décrémentation.
M. Xcoder du
4

Python 2 , 90 octets

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

Essayez-le en ligne!

Erik le Outgolfer
la source
2

05AB1E , 33 octets

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

Essayez-le en ligne!

Erik le Outgolfer
la source
Essayez-le en ligne! - J'ai essayé d'exploiter les modèles "0300" et "2010", ça n'a pas été si chaud.
Magic Octopus Urn
@MagicOctopusUrn Cela n'imprime pas non plus un trait de soulignement: p
Erik the Outgolfer
2

Mathematica, 131 octets

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


renvoie une liste de chaînes

Essayez-le en ligne!

J42161217
la source
2

Fusain , 26 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code.

Neil
la source
2

Python 2 , 123 112 110 109 100 98 96 octets

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

Essayez-le en ligne!

  • Enregistré un tas d'octets en utilisant le formatage d'entrée et de chaîne comme dans la réponse de Rod
  • Enregistré 2 octets grâce à M. Xcoder
TFeld
la source
1
Vous pouvez économiser 2 octets en remplaçant -1-apar ~a(comme je l'ai fait dans ma réponse).
M. Xcoder
@ Mr.Xcoder Merci :)
TFeld
1

Python 2 , 103 octets

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

Essayez-le en ligne!

Barre
la source
1

Haskell , 96 95 octets

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

Essayez-le en ligne!

Indexé en 0 et retourne une liste de lignes.

Laikoni
la source
0

Haskell, 101 99 octets

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

Renvoie une liste de lignes.

Essayez-le en ligne!

Comment ça fonctionne:

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

Modifier: @Laikoni a enregistré deux octets. Merci!

nimi
la source
([1,3..n-1]>>)peut être utilisé à la place de ([1..div n 2]>>).
Laikoni
0

Java (OpenJDK 8) , 315 306 octets

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

Essayez-le en ligne!

Roberto Graham
la source
0

Java (OpenJDK 8) , 198 octets

Enfin obtenu en dessous de 200 octets. Publiera probablement une explication plus tard.

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

Essayez-le en ligne!

Luke Stevens
la source
0

JavaScript (ES6), 89 85 octets

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

Démo

Arnauld
la source
0

CJam, 43

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

Essayez-le en ligne

aditsu
la source
0

PHP, 89 + 1 octets

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

Exécuter en tant que pipe avec -nRou l' essayer en ligne .

Titus
la source
0

Pyth ,  46  44 octets

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

Essayez-le ici!

M. Xcoder
la source