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

Reply via email to