You could build a oneliner out of this multistage process:


   d =:  0 1 2 2 1 1 2 2 3
   indent =: '  ' <@(#"0 1~) 0 >. <: +/ (i.@# </~ <:@# - (i. ~.)@|.)d
   branch =: a: , (1 ,~ }: 0 = 2 -/\&.|. d) <@{ 2 2 $ '|-+-'
   infix =: (<@:,&>/)"1 indent,.branch
   prefix =: '| ' <@#"0 1~ d - , -:@$@> infix
   ;"1 prefix ,. infix ,. <'o'


which gives the desired result for d
I didn’t test on larger/more complex trees, though.

Am 07.08.20 um 15:19 schrieb ethiejiesa via Programming:
Do you know a slick way of pretty-printing a tree given its depth vector
representation?

A vector represents a tree if and only if it satisfies the following:

        NB. Tree valid? First node is root node (depth 0), only one root node,
        NB. and all nodes are exactly one deeper than their parent
        tv=: 0&=@{. *. *./@(>&0)@}. *. 1 *./@:>: +/\^:_1

The goal is to produce a nice visualization given a valid depth vector. For
example, given (d=: 0 1 2 2 1 1 2 2 3), something like this would be ideal:

     o
     |-o
     | |-o
     | +-o
     |-o
     +-o
       |-o
       +-o
         +-o

About the best I can do in a single line is this:

        NB. Tree print
        tp=: (, LF&,)/@({&' |o-')@((3&*@=/ |:@}.@(,/)@(,:"1&|:) 2&*@=/ +. >/) 
~.)
        tp d
     o
     |-o
     | |-o
     | | |-o
     |-o
     | |-o
     | | |-o
     |-o
     | |-o
     | | |-o

Trimming the branches, however, is giving me a lot of grief. Can you do better?
I am looking for terse one-liners but am open to alternative visualizations.

Producing segments of "trimmed branches" is a nice little sub-problem. It
corresponds to finding finding "catenaries", i.e. runs of integers capped on
the left and right by n, where the intervening integers "droop below" n, i.e.
satisfy (>:n).


Looking forward to your ideas!
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm


--
----------------------
mail written using NEO
neo-layout.org

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to