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

# 3B. Merge and Amend

Two arguments `x` and `y` can be merged by interleaving their items (necessarily of a common shape) as determined by a Boolean list of shape `x +&# y`. For example:

       x=: >;:'That they hunted from hill'
       y=: >;:'second time me to plain'
       b=: 0 1 1 0 0 1 0 0 1 1
       mrg=: 1 : '/:@/:@(x."_) { ,'
       x([ ; ] ; (,.b)"_ ; b mrg)y
    +----------------------+
    ¦That  ¦second¦0¦That  ¦
    ¦they  ¦time  ¦1¦second¦
    ¦hunted¦me    ¦1¦time  ¦
    ¦from  ¦to    ¦0¦they  ¦
    ¦hill  ¦plain ¦0¦hunted¦
    ¦      ¦      ¦1¦me    ¦
    ¦      ¦      ¦0¦from  ¦
    ¦      ¦      ¦0¦hill  ¦
    ¦      ¦      ¦1¦to    ¦
    ¦      ¦      ¦1¦plain ¦
    +----------------------+

The form of the function `b mrg` obtained by applying the adverb `mrg` suggests the form of a function `MRG` to be applied to a Boolean left argument and a right argument formed as the catenation of the original arguments. Thus:

       b mrg
    /:@/:@(0 1 1 0 0 1 0 0 1 1"_) { ,

       MRG=: /:@/:@[ { ]
       b MRG x,y
    That
    second
    time
    they
    hunted
    me
    from
    hill
    to
    plain

The argument b need not be Boolean, but may be anything of the requisite number of items that is in the domain of `/:`. For example:

       b=: 0 2 2 1 0 2 2 2 0 0 1 1 2 1 2 1 1 1 1 1
       y0=: 'abcd' [ y1=: '123456789' [ y2=: 'zzzzzzz'
       b MRG y0,y1,y2
    azz1bzzzcd23z4z56789

`a0=: mrg=: 1 : '/:@/:@(x."_) { ,'` | `x b mrg y` merges x and y
`m1=: MRG=: /:@/:@[ { ]` | `b MRG x,y` is equivalent to above
`d2=: alt=: ,@,.` | Merge items from x and y alternately

For example:

       x=: 'temr rtes'
       y=: 'h axbohr '
       x alt y
    the marx brothers

An argument can be amended by replacing those cells selected by an index, by the cells of another argument. For example:

       x=: 'ABCD' [ y=: 'abcdefghij'
       i=: 4 2 8 6
       i{y
    ecig

       ]z=: x i} y
    abBdAfDhCj

       m=: a.{~(a. i. 'A')+i.5 5
    ]i=: 2 # &.> i. # m
    +-------------------+
    ¦0 0¦1 1¦2 2¦3 3¦4 4¦
    +-------------------+

       x=: '+-*%^'
       m ; (i{m) ; x ; x i} m
    +-----------------------+
    ¦ABCDE¦AGMSY¦+-*%^¦+BCDE¦
    ¦FGHIJ¦     ¦     ¦F-HIJ¦
    ¦KLMNO¦     ¦     ¦KL*NO¦
    ¦PQRST¦     ¦     ¦PQR%T¦
    ¦UVWXY¦     ¦     ¦UVWX^¦
    +-----------------------+

Amendment can also be made by using a function that selects a portion of its argument. For example:

       IR=: @(i.@$@]) Adverb to select indices of (ravelled) table right argument
       A=: IR } Adverb to amend selected portion of right argument
       d=: (<0 1)&|: Function to select diagonal of a table
       '+-*%^' (] ; d@] ; ]IR ; d IR ; d IR } ; d A) m
    +---------------------------------------------------+
    ¦ABCDE¦AGMSY¦ 0  1  2  3  4¦0 6 12 18 24¦+BCDE¦+BCDE¦
    ¦FGHIJ¦     ¦ 5  6  7  8  9¦            ¦F-HIJ¦F-HIJ¦
    ¦KLMNO¦     ¦10 11 12 13 14¦            ¦KL*NO¦KL*NO¦
    ¦PQRST¦     ¦15 16 17 18 19¦            ¦PQR%T¦PQR%T¦
    ¦UVWXY¦     ¦20 21 22 23 24¦            ¦UVWX^¦UVWX^¦
    +---------------------------------------------------+
            m      diag m    Indices of ravelled m  Indices of diagonal  Amendments

       ur=: 2 _3&{.  Select upper right corner
       (2 3$'+-*%^!') (] ; ur@] ; ]IR ; ur IR ; ur IR } ; ur A) m
    +------------------------------------------+
    ¦ABCDE¦CDE¦ 0  1  2  3  4¦2 3 4¦AB+-*¦AB+-*¦
    ¦FGHIJ¦HIJ¦ 5  6  7  8  9¦7 8 9¦FG%^!¦FG%^!¦
    ¦KLMNO¦   ¦10 11 12 13 14¦     ¦KLMNO¦KLMNO¦
    ¦PQRST¦   ¦15 16 17 18 19¦     ¦PQRST¦PQRST¦
    ¦UVWXY¦   ¦20 21 22 23 24¦     ¦UVWXY¦UVWXY¦
    +------------------------------------------+

`a3=: IR=: @(i.@$@])` | `f IR` selects indices of ravelled rgt arg
`m4=: d=: (<0 1)&|:` | Function to select diagonal of table
`m5=: ur=: 2 _3&{.` | Function to select upper right corner

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