ASCII art H arbres


9

Un arbre H est une structure d'arbre fractal qui commence par une ligne. À chaque itération, des branches T sont ajoutées à tous les points de terminaison. Dans ce défi, vous devez créer une représentation ASCII de chaque deuxième niveau d'arbre H.

Le premier niveau contient simplement trois caractères de trait d'union moins:

---

Les niveaux suivants sont construits récursivement:

  • Créez une matrice 2x2 de copies du niveau précédent, séparées par trois espaces ou lignes.
  • Reliez les centres des copies avec des lignes artistiques ASCII sous la forme d'un H. À utiliser -pour les lignes horizontales, |pour les lignes verticales et +chaque fois que les lignes se rencontrent.

Deuxième niveau

-+-   -+-
 |     |
 +-----+
 |     |
-+-   -+-

Troisième niveau

-+-   -+-   -+-   -+-
 |     |     |     |
 +--+--+     +--+--+
 |  |  |     |  |  |
-+- | -+-   -+- | -+-
    |           |
    +-----------+
    |           |
-+- | -+-   -+- | -+-
 |  |  |     |  |  |
 +--+--+     +--+--+
 |     |     |     |
-+-   -+-   -+-   -+-

Règles

  • L'entrée est un entier représentant le niveau de l'arbre H ASCII art tel que décrit ci-dessus ( pas le niveau réel de l'arbre H), soit zéro soit un indexé.
  • La sortie est flexible. Par exemple, vous pouvez imprimer le résultat ou renvoyer une chaîne séparée par des sauts de ligne, une liste de chaînes pour chaque ligne ou un tableau 2D de caractères.
  • Vous devez utiliser -, |, +et des espaces.
  • L'espace de fin et jusqu'à trois lignes d'espace de fin sont autorisés.

C'est le golf de code. La réponse la plus courte en octets l'emporte.


Réponses:


7

Toile , 20 19 octets

ø⁸«╵[↷L⇵;l⇵└┌├-×╋‼│

Essayez-le ici!

Explication:

ø                    push an empty canvas
 ⁸«╵[              repeat input*2 + 1 times
     ↷               rotate clockwise
      L⇵             ceil(width/2)
        ;l⇵          ceil(height/2); leaves stack as [ ⌈½w⌉, canvas, ⌈½h⌉ ]
           └┌        reorder stack to [ canvas, ⌈½w⌉, ⌈½h⌉, ⌈½w⌉ ]
             ├       add 2 to the top ⌈w÷2⌉
              -×     "-" * (2 + ⌈w÷2⌉)
                ╋    in the canvas, at (⌈w÷2⌉; ⌈h÷2⌉) insert the dashes
                 ‼   normalize the canvas (the 0th iteration inserts at (0; 0) breaking things)
                  │  and palindromize horizontally

7

Fusain , 22 octets

P-²FNF²«⟲T²+×⁺²κX²ι←‖O

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

P-²

Imprimez les trois premiers -s en laissant le curseur au milieu.

FN

Répétez l'opération pour le nombre de fois indiqué.

F²«

Répétez deux fois pour chacun H. Chaque boucle crée un peu plus grand que Hla boucle précédente, mais nous voulons seulement des Hs alternatifs .

⟲T²

Faites pivoter la figure.

+×⁺²κX²ι←

Tracez la moitié de la ligne suivante.

‖O

Réfléchissez pour terminer l'étape.

Le résultat à chaque itération est le suivant:

---

|   |
+---+
|   |

-+-   -+-
 |     | 
 +-----+ 
 |     | 
-+-   -+-

|   |   |   |
+-+-+   +-+-+
| | |   | | |
  |       |  
  +-------+  
  |       |  
| | |   | | |
+-+-+   +-+-+
|   |   |   |

-+-   -+-   -+-   -+-
 |     |     |     | 
 +--+--+     +--+--+ 
 |  |  |     |  |  | 
-+- | -+-   -+- | -+-
    |           |    
    +-----------+    
    |           |    
-+- | -+-   -+- | -+-
 |  |  |     |  |  | 
 +--+--+     +--+--+ 
 |     |     |     | 
-+-   -+-   -+-   -+-

Si vous vous demandez à quoi ressemble un 5ème niveau H, un coup d'œil rapide sur le zoom: i.imgur.com/EGapcrS.png
Paul

1

Python 2 , 227 octets

L=len
def f(n):
 if n==1:return[['-']*3]
 m=[l+[' ']*3+l for l in f(n-1)];w=L(m[0]);y=L(m)/2;x=w/4-1;m=map(list,m+[' '*w,' '*x+'-'*(w-x-x)+' '*x,' '*w]+m)
 for i in range(y,L(m)-y):m[i][x]=m[i][w+~x]='|+'[m[i][x]>' ']
 return m

Essayez-le en ligne!


0

Perl 6 , 118 octets

{map ->\y{map {' |-+'.comb[:2[map {$^b%%1*$b&&6>=$^a/($b+&-$b)%8>=2},$^x/¾,y/2,y,$x/3-$_]]},2..^$_*6},2..^$_*4}o*R**2

Essayez-le en ligne!

0 indexé. Renvoie un tableau 2D de caractères. L'idée de base est que l'expression

b = y & -y   // Isolate lowest one bit
b <= x % (4*b) <= 3*b

génère le motif

--- --- --- ---
 -----   ----- 
--- --- --- ---
   ---------   
--- --- --- ---
 -----   ----- 
--- --- --- ---

Explication

{ ... }o*R**2  # Feed $_=2**$n into block
map ->\y{ ... },2..^$_*4  # Map y=2..2**n*4-1
map { ... },2..^$_*6      # Map $x=2..2**n*6-1
' |-+'.comb[:2[ ... ]]    # Choose char depending on base-2 number from two Bools
map { ... }  # Map coordinates to Bool
  # Horizontal lines
  ,$^x  # Modulo 8*¾=6
  ,y/2    # Skip every second row
  # Vertical lines
  ,y      # Modulo 8
  ,$x/3   # Skip every third column
   -$_    # Empty middle column
# Map using expression
$^b%%1*$b&&  # Return 0 if $b is zero or has fractional part
6>=$^a/($b+&-$b)%8>=2  # Pattern with modulo 8
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.