ASCII Art H Bäume

9

Ein H-Baum ist eine fraktale Baumstruktur, die mit einer Linie beginnt. In jeder Iteration werden T-Zweige zu allen Endpunkten hinzugefügt. Bei dieser Herausforderung müssen Sie eine ASCII-Darstellung jeder zweiten H-Baumebene erstellen .

Die erste Ebene enthält einfach drei Bindestrich-Minus-Zeichen:

---

Die nächsten Ebenen sind rekursiv aufgebaut:

  • Erstellen Sie eine 2x2-Matrix von Kopien der vorherigen Ebene, die durch drei Leerzeichen oder Zeilen getrennt sind.
  • Verbinden Sie die Mitten der Kopien mit ASCII-Kunstlinien in Form eines H. Verwenden Sie diese Option -für horizontale Linien, |für vertikale Linien und +immer dann , wenn Linien aufeinander treffen.

Zweites Level

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

Drittes Level

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

Regeln

  • Die Eingabe ist eine Ganzzahl, die die oben beschriebene Ebene des ASCII-Art-H-Baums darstellt ( nicht die tatsächliche Ebene des H-Baums), entweder null- oder einsindiziert.
  • Die Ausgabe ist flexibel. Sie können beispielsweise das Ergebnis drucken oder eine durch Zeilenumbrüche getrennte Zeichenfolge, eine Liste von Zeichenfolgen für jede Zeile oder ein 2D-Array von Zeichen zurückgeben.
  • Sie müssen verwenden -, |, +und Leerzeichen.
  • Leerzeichen und bis zu drei Leerzeichen sind zulässig.

Das ist Code Golf. Die kürzeste Antwort in Bytes gewinnt.

nwellnhof
quelle

Antworten:

7

Leinwand , 20 19 Bytes

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

Probieren Sie es hier aus!

Erläuterung:

ø                    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
Dzaima
quelle
7

Holzkohle , 22 Bytes

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

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. 0-indiziert. Erläuterung:

P-²

Drucken Sie die ersten drei -Sekunden aus und lassen Sie den Cursor in der Mitte.

FN

Wiederholen Sie dies für die angegebene Anzahl von Malen.

F²«

Wiederholen Sie dies jeweils zweimal H. Jede Schleife erzeugt eine etwas größere HSchleife aus der vorherigen Schleife, aber wir wollen nur alternative Hs.

⟲T²

Drehen Sie die Figur.

+×⁺²κX²ι←

Zeichnen Sie die Hälfte der nächsten Linie.

‖O

Überlegen Sie, um den Schritt abzuschließen.

Das Ergebnis bei jeder Iteration ist wie folgt:

---

|   |
+---+
|   |

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

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

-+-   -+-   -+-   -+-
 |     |     |     | 
 +--+--+     +--+--+ 
 |  |  |     |  |  | 
-+- | -+-   -+- | -+-
    |           |    
    +-----------+    
    |           |    
-+- | -+-   -+- | -+-
 |  |  |     |  |  | 
 +--+--+     +--+--+ 
 |     |     |     | 
-+-   -+-   -+-   -+-
Neil
quelle
Wenn Sie sich fragen, wie ein fünftes Level Haussieht, werfen Sie
Paul
1

Python 2 , 227 Bytes

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

Probieren Sie es online aus!

TFeld
quelle
0

Perl 6 , 118 Bytes

{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

Probieren Sie es online aus!

0-indiziert. Gibt ein 2D-Array von Zeichen zurück. Die Grundidee ist, dass der Ausdruck

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

erzeugt das Muster

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

Erläuterung

{ ... }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
nwellnhof
quelle