# ASCII art H trees

An H tree is a fractal tree structure that starts with a line. In each iteration, T branches are added to all endpoints. In this challenge, you have to create an ASCII representation of every second H tree level.

The first level simply contains three hyphen-minus characters:

---


The next levels are constructed recursively:

• Create a 2x2 matrix of copies from the previous level, separated by three spaces or lines.
• Connect the centers of the copies with ASCII art lines in the form of an H. Use - for horizontal lines, | for vertical lines, and + whenever lines meet each other.

### Second level

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


### Third level

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


## Rules

• Input is an integer representing the level of the ASCII art H tree as described above (not the actual H tree level), either zero- or one-indexed.
• Output is flexible. For example, you can print the result or return a newline-separated string, a list of strings for each line, or a 2D array of characters.
• You must use -, |, + and space characters.
• Trailing space and up to three trailing white-space lines are allowed.

This is code golf. The shortest answer in bytes wins.

# Canvas, 20 19 bytes

ø⁸«╵［↷Ｌ⇵；ｌ⇵└┌├-×╋‼│


Try it here!

Explanation:

ø                    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


# Charcoal, 22 bytes

Ｐ-²ＦＮＦ²«⟲Ｔ²+×⁺²κＸ²ι←‖Ｏ


Try it online! Link is to verbose version of code. 0-indexed. Explanation:

Ｐ-²


Print the initial three -s, leaving the cursor in the middle.

ＦＮ


Repeat for the number of times given.

Ｆ²«


Repeat twice for each H. Each loop creates a slightly bigger H from the previous loop, but we only want alternate Hs.

⟲Ｔ²


Rotate the figure.

+×⁺²κＸ²ι←


Draw half of the next line.

‖Ｏ


Reflect to complete the step.

The result at each iteration is as follows:

---

|   |
+---+
|   |

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

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

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

• If you wonder how a 5-th level H looks like, a quick zoomed-out glance: i.imgur.com/EGapcrS.png
– Paul
Nov 25 '18 at 17:59

# 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);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


Try it online!

# 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


Try it online!

0-indexed. Returns a 2D array of characters. The basic idea is that the expression

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


generates the pattern

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


### Explanation

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