...Y'know, once you ask the question in the right way, the answer becomes obvious...
I already have a verb around to invert permutations: ip=: ] i. [: i. # Now the inverse of the permutation we want is easy to define. We simply extract x and haul it to the front: baa=: 4 : 'x,(i.y)-.x' Hey presto! 3 ip@baa 10 1 2 3 0 4 5 6 7 8 9 Tacitly: foo=: (] i. [: i. #)@([ , [ -.~ [: i. ]) timer '3 foo 10' 2.79236e_5 ...which I think is one of the fastest. On Sun, May 1, 2011 at 2:01 PM, Ian Clark <[email protected]> wrote: >> btw: why is this useful? > > I was waiting for someone to ask... > > I often find I'm interactively editing a list t of strings -- often > large, and often (though not always) a 2D char matrix -- frequently > sorting them to promote or demote a given entry. It's convenient for > me to rearrange t using a permutation, p, like so: > p{t > especially as successive p's can be multiplied together to apply in > one-shot, or to apply as the inverse-perm to revert to a previous > stage. > And to add a new line at position (i) in a comparable way: > p=. i foo >:#t > p{ newline,t > rather than like so: > (i{.t),newline, i}.t > which growing up on smaller and slower computers distresses me. > > What I've been asking for is help towards an efficient p. > > You can also do: > p{ t,newline > which is why I'm also interested in solutions floating the last > element down to position i, as well as the first element up. > > Succint float-down solutions seem to be easier to find. I suspect this > is thanks to the way A. orders permutations lexicographically, ie > back-to-front from the way I'd do it. > > Now you know what I want to use it for, am I barking up the wrong > tree: is there a far better approach to the problem of rearranging > large lists? > > > On Sun, May 1, 2011 at 2:59 AM, Steven Taylor <[email protected]> wrote: >> 3 /:@:(([,-.~) i.) 10 >> neat. I liked Henry's sneaky version: >> >> 3 /:@(0} i.) 9 >> I need to catch up with the thread and think through the C. and A. >> approaches a little more. >> >> btw: why is this useful? >> >> -Steven >> >> >> On 30 April 2011 23:49, Marshall Lochbaum >> <[email protected]>wrote: >> >>> Probably not very fast, but this one is cool: >>> 3 /:@:(([,-.~) i.) 10 >>> 1 2 3 0 4 5 6 7 8 9 >>> >>> Marshall >>> >>> -----Original Message----- >>> From: [email protected] >>> [mailto:[email protected]] On Behalf Of R.E. Boss >>> Sent: Saturday, April 30, 2011 4:48 PM >>> To: 'Programming forum' >>> Subject: Re: [Jprogramming] A permutation of i.y >>> >>> This revealed an error in my solution. >>> It should be >>> >>> 3 7 (+/@:!@(]->:@([+ i.@-~)/@[) A. i.@] )10 >>> 0 1 2 4 5 6 7 3 8 9 >>> >>> 0 3 (+/@:!@(]->:@([+ i.@-~)/@[) A. i.@] )10 >>> 1 2 3 0 4 5 6 7 8 9 >>> >>> If only the first item has to be moved, then you get the simpler >>> >>> 3 (+/@:!@(]->:@i.@[) A. i.@] )10 >>> 1 2 3 0 4 5 6 7 8 9 >>> >>> >>> R.E. Boss >>> >>> >>> > -----Oorspronkelijk bericht----- >>> > Van: [email protected] [mailto:programming- >>> > [email protected]] Namens Brian Schott >>> > Verzonden: zaterdag 30 april 2011 17:40 >>> > Aan: Programming forum >>> > Onderwerp: Re: [Jprogramming] A permutation of i.y >>> > >>> > Yet another approach? >>> > >>> > foo0=: +/@:!@:>:@:i. >>> > foo =: (<:@]-&foo0-~) A. i.@] >>> > 3 foo 9 >>> > 1 2 0 3 4 5 6 7 8 >>> > >>> > >>> > On Fri, Apr 29, 2011 at 10:05 AM, Raul Miller <[email protected]> >>> wrote: >>> > > This might be what you want: >>> > > >>> > > foo=: (C.~ <)&i.~ >>> > > >>> > > 3 (C.~ <)&i.~ 9 >>> > > 1 2 0 3 4 5 6 7 8 >>> > > >>> > > -- >>> > > Raul >>> > >>> > >>> > -- >>> > (B=) >>> > ---------------------------------------------------------------------- >>> > 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 >> > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
