very nice, thank you.

Its not quite the same, as the explicit version allows for a select verb like 
picking out the rows where column 2 is prime

   (0 _2:amdt  2 +:amdt ])"1 amend (I.@:(1&p:)@:(2&{"1))  i. 5 5
_2  1  4  3  4
_2  6 14  8  9
10 11 12 13 14
_2 16 34 18 19
20 21 22 23 24

though a workaround is faster for large data:
     (I.@:(1&p:)@:(2&{"1) a)  (0 _2:amdt  2 +:amdt ])"1 amdt a=. i. 5 5



I can't seem to get the L:0 version working though:

amdtL0 =. ((((@:{(L:0)))((`[)(`])))}(L:0))

compared to:


amendL0_z_ =: 2 : 0  NB. v is n or n{"num
s=. v"_ y
(u (s{ L:0 y)) (s}) L:0 y 
)

replace all 4 columns for rows 0-3
   (i.4) (0;1;2;'f')"1 amdt    amendL0 (i.3) (<"1 &. |:  i. 5 3), <'ABCDE'
┌──────────┬───────────┬───────────┬─────┐
│0 0 0 9 12│1 1 1 10 13│2 2 2 11 14│fffDE│
└──────────┴───────────┴───────────┴─────┘

rearrange columns for rows 2 and 3
   ((<'f') ,~ |.@:}:)"1 amendL0 2 3 (<"1 &. |:  i. 5 3), <'ABCDE'
┌───────────┬───────────┬──────────┬─────┐
│0 3 8 11 12│1 4 7 10 13│2 5 6 9 14│ABffE│
└───────────┴───────────┴──────────┴─────┘


----- Original Message -----
From: June Kim (김창준) <[email protected]>
To: Programming forum <[email protected]>
Cc: 
Sent: Monday, September 23, 2013 1:22:32 PM
Subject: Re: [Jprogramming] A useful amend conjunction

I think someone might be interested in a tacit version.


   amdt=.((@:{)((`[)(`])))}
   3 (0 _2: amdt 2 _1: amdt ]) amdt i. 5 5
0  1  2  3  4
5  6  7  8  9
10 11 12 13 14
_2 16 _1 18 19
20 21 22 23 24

   3 4 5 ((-&32)&.(a.&i.)) amdt 'abcdefgh'
abcDEFgh



On Sun, Sep 22, 2013 at 8:48 AM, Pascal Jasmin <[email protected]>wrote:

> Here is what seems to me a much easier/saner version of amend to use,
> especially for chained amends.  2 versions, one called for L:0 y, then
> other without.  The dyad version doesn't seem totally necessary.
>
> amend_z_ =: 2 : 0  NB. v is n or n{"num
> if. 0 = 4!:0 <'v' do. s =. v else. s =. v y end.
> (u (s{y)) (s}) y
> :
> if. 0 = 4!:0 <'v' do. s =. v else. s =. v y end.
> (x u (s{y)) (s}) y
> )
>
> amendL0_z_ =: 2 : 0  NB. v is n or n{"num
> if. 0 = 4!:0 <'v' do. s =. v else. s =. v y end.
> (u (s{ L:0 y)) (s}) L:0 y
> :
> if. 0 = 4!:0 <'v' do. s =. v else. s =. v y end.
> (x u (s{ L:0)y) (s} L:0) y
> )
>
>   ([: 2: amend 0 3: amend 1)  amend 2 ( i. 5 3)  NB. replace in row 2, col
> 0 and 1
>  0  1  2
>  3  4  5
>  2  3  8
>  9 10 11
> 12 13 14
>    ([: 2: amend 0 3: amend 1)  amend 2 &.|: ( i. 5 3) NB. replace in col
> 2, row 0 and 1
>  0  1  2
>  3  4  3
>  6  7  8
>  9 10 11
> 12 13 14
>
>
>    ((0;'f')"_ amend 1 3)  amendL0 3 (<"1 &. |:  i. 5 3), <'ABCDE'  NB. for
> row 3, replace col 1 and 3
> ┌──────────┬──────────┬───────────┬─────┐
> │0 3 6 9 12│1 4 7 0 13│2 5 8 11 14│ABCfE│
> └──────────┴──────────┴───────────┴─────┘
>
>    ( 2&+ L:0 amend 1 2)  amendL0 3 4 (<"1 &. |:  i. 5 3), <'ABCDE'  NB.
> use function y, to replace col 1 and 2 of row 3 and 4
> ┌──────────┬───────────┬───────────┬─────┐
> │0 3 6 9 12│1 4 7 12 15│2 5 8 13 16│ABCDE│
> └──────────┴───────────┴───────────┴─────┘
>
>
> or dyad:
>
>    2( + L:0 amend 1 2)  amendL0 3 4 (<"1 &. |:  i. 5 3), <'ABCDE'
> ┌──────────┬───────────┬───────────┬─────┐
> │0 3 6 9 12│1 4 7 12 15│2 5 8 13 16│ABCDE│
> └──────────┴───────────┴───────────┴─────┘
>
> more complex function: change row 3 from 9;10;11;'D' to 11;10;9;'f'
>
>    ((<'f') ,~ |.@:}:) amendL0 3 (<"1 &. |:  i. 5 3), <'ABCDE'
> ┌───────────┬───────────┬──────────┬─────┐
> │0 3 6 11 12│1 4 7 10 13│2 5 8 9 14│ABCfE│
> └───────────┴───────────┴──────────┴─────┘
>
>
> for improvements, the v side could be a 2 sided gerund for the {`} sides
> which could be for example {"1`}"1 or {L:0`}L:0
>
>
> Thank you Raul and Aai for your help.
>
>
> ----- Original Message -----
> From: Raul Miller <[email protected]>
> To: Programming forum <[email protected]>
> Cc:
> Sent: Saturday, September 21, 2013 12:50:48 AM
> Subject: Re: [Jprogramming] Amend trickiness part 2
>
> On Fri, Sep 20, 2013 at 6:21 PM, Pascal Jasmin <[email protected]>
> wrote:
> >> I wanted to use the dyadic definition, but did not have
> >> a meaningful value for x, so I used ~ (giving the effect of y m} y).
> >
> > There seems to be a lot more going on there.  There is already an x
> value of 1.
>
> Here?
>
>    1 3:`2:`]}~&.>@{`[`]} <"1 |:  i. 5 3
>
> In this case, the ~ in the phrase 3:`2:`]}~&.>@... appears in the verb
> which is on the left side of an @
>
> And we always use the monadic definition of the verb on the left of the @
>
> So we use the monadic definition of 3:`2:`]}~&.> and so we use the
> monadic definition of 3:`2:`]}~
>
> (And the tilde means we use the dyadic definition of 3:`2:`]})
>
> That said, I should point out that there's something subtle going on
> here, with word boundaries:
>
>    ;:'1 2 3: 4 5'
> +---+--+---+
> |1 2|3:|4 5|
> +---+--+---+
>
> > for instance with the value x of _3 _2 0 or 2, an answer is provided,
> > but item 1 of the middle cell is also modified.  Other values of x
> > give various domain or index errors.  If the '~' is removed, then x
> > values of 0 to 2, produce a middle cell of 6 to 8.  I can't follow
> > what causes those results at all.
>
> The x that I think you are speaking of here is relevant for the verb
> on the right hand side of the @ so lets simplify the left hand side
> and play with the expression a bit:
>
>    1 <@0:@{`[`]} <"1 |:  i. 5 3
> +----------+-+-----------+
> |0 3 6 9 12|0|2 5 8 11 14|
> +----------+-+-----------+
>    _3 _2 0 <@0:@{`[`]} <"1 |:  i. 5 3
> +-+-+-----------+
> |0|0|2 5 8 11 14|
> +-+-+-----------+
>    2 <@0:@{`[`]} <"1 |:  i. 5 3
> +----------+-----------+-+
> |0 3 6 9 12|1 4 7 10 13|0|
> +----------+-----------+-+
>
> Note also that index _3 is (for this argument) the same as index 0.
>
> > Next I'm trying to change columns 1 and 4 row 2 to 3 and 'F', but I
> expect that to be harder.
>
> Well... I'm not quite sure what you want there, but let us assume that
> you want to change
>
>    (<"1 &. |:  i. 5 3), <'ABCDE'
> +----------+-----------+-----------+-----+
> |0 3 6 9 12|1 4 7 10 13|2 5 8 11 14|ABCDE|
> +----------+-----------+-----------+-----+
>
> to
>
> +----------+-----------+-----------+-----+
> |0 3 3 9 12|1 4 7 10 13|2 5 8 11 14|ABFDE|
> +----------+-----------+-----------+-----+
>
> if so, a phrase that would accomplish that would be:
>
>    (3;7;8;'F') [`2:`]}&.> data
>
> Here, I've presumed that you are calling the contents of a box a
> "column" and that you are calling the location within a box a "row".
> I've also presumed that you have added 1 to the "column index" when
> you are speaking of "columns 1 and 4". I could easily be wrong,
> though, about your intentions. If so, let us know and we can try
> again?
>
> Thanks,
>
> --
> Raul
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm 
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to