ASCII art H trees











up vote
8
down vote

favorite
1












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.










share|improve this question


















  • 2




    Related: Create an “H” from smaller “H”s
    – nwellnhof
    2 days ago















up vote
8
down vote

favorite
1












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.










share|improve this question


















  • 2




    Related: Create an “H” from smaller “H”s
    – nwellnhof
    2 days ago













up vote
8
down vote

favorite
1









up vote
8
down vote

favorite
1






1





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.










share|improve this question













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.







code-golf ascii-art fractal






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 2 days ago









nwellnhof

6,3081125




6,3081125








  • 2




    Related: Create an “H” from smaller “H”s
    – nwellnhof
    2 days ago














  • 2




    Related: Create an “H” from smaller “H”s
    – nwellnhof
    2 days ago








2




2




Related: Create an “H” from smaller “H”s
– nwellnhof
2 days ago




Related: Create an “H” from smaller “H”s
– nwellnhof
2 days ago










3 Answers
3






active

oldest

votes

















up vote
7
down vote














Charcoal, 22 bytes



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


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



P-²


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



FN


Repeat for the number of times given.



F²«


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



⟲T²


Rotate the figure.



+×⁺²κX²ι←


Draw half of the next line.



‖O


Reflect to complete the step.



The result at each iteration is as follows:



---

| |
+---+
| |

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

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

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





share|improve this answer





















  • If you wonder how a 5-th level H looks like, a quick zoomed-out glance: i.imgur.com/EGapcrS.png
    – Paul
    2 days ago


















up vote
6
down vote














Canvas, 20 19 bytes



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


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





share|improve this answer






























    up vote
    1
    down vote














    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


    Try it online!






    share|improve this answer





















      Your Answer





      StackExchange.ifUsing("editor", function () {
      return StackExchange.using("mathjaxEditing", function () {
      StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
      StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
      });
      });
      }, "mathjax-editing");

      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "200"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      convertImagesToLinks: false,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: null,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














       

      draft saved


      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f176521%2fascii-art-h-trees%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      3 Answers
      3






      active

      oldest

      votes








      3 Answers
      3






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes








      up vote
      7
      down vote














      Charcoal, 22 bytes



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


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



      P-²


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



      FN


      Repeat for the number of times given.



      F²«


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



      ⟲T²


      Rotate the figure.



      +×⁺²κX²ι←


      Draw half of the next line.



      ‖O


      Reflect to complete the step.



      The result at each iteration is as follows:



      ---

      | |
      +---+
      | |

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

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

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





      share|improve this answer





















      • If you wonder how a 5-th level H looks like, a quick zoomed-out glance: i.imgur.com/EGapcrS.png
        – Paul
        2 days ago















      up vote
      7
      down vote














      Charcoal, 22 bytes



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


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



      P-²


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



      FN


      Repeat for the number of times given.



      F²«


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



      ⟲T²


      Rotate the figure.



      +×⁺²κX²ι←


      Draw half of the next line.



      ‖O


      Reflect to complete the step.



      The result at each iteration is as follows:



      ---

      | |
      +---+
      | |

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

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

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





      share|improve this answer





















      • If you wonder how a 5-th level H looks like, a quick zoomed-out glance: i.imgur.com/EGapcrS.png
        – Paul
        2 days ago













      up vote
      7
      down vote










      up vote
      7
      down vote










      Charcoal, 22 bytes



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


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



      P-²


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



      FN


      Repeat for the number of times given.



      F²«


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



      ⟲T²


      Rotate the figure.



      +×⁺²κX²ι←


      Draw half of the next line.



      ‖O


      Reflect to complete the step.



      The result at each iteration is as follows:



      ---

      | |
      +---+
      | |

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

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

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





      share|improve this answer













      Charcoal, 22 bytes



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


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



      P-²


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



      FN


      Repeat for the number of times given.



      F²«


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



      ⟲T²


      Rotate the figure.



      +×⁺²κX²ι←


      Draw half of the next line.



      ‖O


      Reflect to complete the step.



      The result at each iteration is as follows:



      ---

      | |
      +---+
      | |

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

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

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






      share|improve this answer












      share|improve this answer



      share|improve this answer










      answered 2 days ago









      Neil

      78.2k744175




      78.2k744175












      • If you wonder how a 5-th level H looks like, a quick zoomed-out glance: i.imgur.com/EGapcrS.png
        – Paul
        2 days ago


















      • If you wonder how a 5-th level H looks like, a quick zoomed-out glance: i.imgur.com/EGapcrS.png
        – Paul
        2 days ago
















      If you wonder how a 5-th level H looks like, a quick zoomed-out glance: i.imgur.com/EGapcrS.png
      – Paul
      2 days ago




      If you wonder how a 5-th level H looks like, a quick zoomed-out glance: i.imgur.com/EGapcrS.png
      – Paul
      2 days ago










      up vote
      6
      down vote














      Canvas, 20 19 bytes



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


      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





      share|improve this answer



























        up vote
        6
        down vote














        Canvas, 20 19 bytes



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


        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





        share|improve this answer

























          up vote
          6
          down vote










          up vote
          6
          down vote










          Canvas, 20 19 bytes



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


          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





          share|improve this answer















          Canvas, 20 19 bytes



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


          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






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 2 days ago

























          answered 2 days ago









          dzaima

          14.1k21754




          14.1k21754






















              up vote
              1
              down vote














              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


              Try it online!






              share|improve this answer

























                up vote
                1
                down vote














                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


                Try it online!






                share|improve this answer























                  up vote
                  1
                  down vote










                  up vote
                  1
                  down vote










                  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


                  Try it online!






                  share|improve this answer













                  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


                  Try it online!







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered 16 hours ago









                  TFeld

                  13.7k21239




                  13.7k21239






























                       

                      draft saved


                      draft discarded



















































                       


                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f176521%2fascii-art-h-trees%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Paul Cézanne

                      UIScrollView CustomStickyHeader Resize height generates problems when scroll is too fast

                      Angular material date-picker (MatDatepicker) auto completes the date on focus out