B. Partition

>> << Ndx Usr Pri Phr Dic Rel Voc !: wd Help Phrases

# 5B. Partition

       x=:1 1 0 0 0 1 0 0 1 1
       y=:3 4 8 2 5 6 9 4 5 4
       x +/ ;. 1 y
    3 19 19 5 4

       x < ;. 1 y
    +-------------------+
    |3|4 8 2 5|6 9 4|5|4|
    +-------------------+

       x < ;. 2 y
    +-------------------+
    |3|4|8 2 5 6|9 4 5|4|
    +-------------------+

       x +/ ;. 2 y
    3 4 21 18 4

The foregoing expressions illustrate the use of the cut conjunction (`;.`) to apply the functions sum (`+/`) and box (<) over partitions or fields of the right argument `y` demarked by the boolean left argument `x`. The case of the box gives a clear picture of the partitioning performed; in case `1`, the ones in the left argument mark the beginnings of fields, and in case `2` they mark the ends.

A function (such as the sum scan) that produces non-scalar results illustrates the fact that the box of such a function provides a more readable result:

       x +/\ ;. 2 y
    3  0  0  0
    4  0  0  0
    8 10 15 21
    9 13 18  0
    4  0  0  0

       x <@(+/\) ;. 2 y
    +------------------------+
    |3|4|8 10 15 21|9 13 18|4|
    +------------------------+

       ; x <@(+/\) ;. 2 y
    3 4 8 10 15 21 9 13 18 4

We therefore define a corresponding conjunction:

       cut=: 2 : ';@(<@x.;.y.)'
       x +/\ cut 1 y
    3 4 12 14 19 6 15 19 5 4

       x +/\ cut 2 y
    3 4 8 10 15 21 9 13 18 4

`c0=: cut=: 2 : ';@(<@x.;.y.)'` |
`a1=: c1=: cut 1` | Case 1 of cut
`a2=: c2=: cut 2` | Case 2 of cut
`d3=: pmax=: >./ c1` | Partitioned max over (case 1)
`d4=: pmax2=: >./c2` | Partitioned max over (case 2)
`d5=: pmaxs=: >./\ c1` | Partitioned max scan
`d6=: pnub=: ~. c1` | Partitioned nub
`d7=: psort=: /:~ c1` | Partitioned sort
`d8=: prev=: |. c1` | Partitioned reverse
`m9=: <;._2@(,&':');._2` | UNIX /etc/passwd relation

       x
    1 1 0 0 0 1 0 0 1 1

       y
    3 4 8 2 5 6 9 4 5 4

       (x pmax y) ,: (x pmax2 y)
    3 8 9 5 4
    3 4 8 9 4

      x([ , ] ,psort ,: prev)y
    1 1 0 0 0 1 0 0 1 1
    3 4 8 2 5 6 9 4 5 4
    3 2 4 5 8 4 6 9 5 4
    3 5 2 8 4 4 9 6 5 4

       p=: >;:'sparkle out among the fern to bicker down a valley'
       x (,.@[ ; ,.@] ; psort ; prev) p
    +-------------------------+
    |1|sparkle|sparkle|sparkle|
    |1|out    |among  |fern   |
    |0|among  |fern   |the    |
    |0|the    |out    |among  |
    |0|fern   |the    |out    |
    |1|to     |bicker |down   |
    |0|bicker |down   |bicker |
    |0|down   |to     |to     |
    |1|a      |a      |a      |
    |1|valley |valley |valley |
    +-------------------------+
     x   p	   psort   prev

The monadic case of the 1-cut partitions at each occurrence of the leading item of the argument. Moreover a negative case suppresses the partitioning item. For example:

       q=: 0 4 2 3 0 4 7 6 0 2
       < c1 q
    +-------------------+
    |0 4 2 3|0 4 7 6|0 2|
    +-------------------+

       psort q
    0 2 3 4 0 4 6 7 0 2

       r=: >;:'/do you love me / or do you not / you told me once / but I forgot'
       < cut 1 r
    +---------------------------+
    |/     |/     |/     |/     |
    |do    |or    |you   |but   |
    |you   |do    |told  |I     |
    |love  |you   |me    |forgot|
    |me    |not   |once  |      |
    +---------------------------+

       < cut _1 r
    +---------------------------+
    |do    |or    |you   |but   |
    |you   |do    |told  |I     |
    |love  |you   |me    |forgot|
    |me    |not   |once  |      |
    +---------------------------+

>> << Ndx Usr Pri Phr Dic Rel Voc !: wd Help Phrases