It must have been the early 1980's I last played with permutations in
APL, and it would have been VS APL...

I was well aware of the properties of grade-up (⍋) -- after all it
returns a rearrangement to the ordered list, ie inverts the
rearrangement -- but didn't use it because it did a sort, preferring
to use iota (⍳) --c/f (i.).

I note your point that we have much better sorts nowadays...

]   p=: 8?8
6 0 1 7 2 3 5 4
   I=: i.8
   p i. I      NB. invert p
1 2 4 5 7 6 0 3
   /:p        NB. ditto
1 2 4 5 7 6 0 3
   timer 'p i. I'
1.09863e_5
   timer '/:p'
9.00269e_6

I can't believe how I didn't twig Henry's use of (/:) until you
pointed it out, which would have given the game away. In my haste I
misread it as Transpose, wondered how that could have worked, and
resolved to look into the matter later. Hence my remark about needing
to know my primitives better. :-))


On Sun, May 1, 2011 at 4:00 PM, Roger Hui <[email protected]> wrote:
> Likewise in APL ⍋ computes the inverse of a permutation
> and has been so for 45 years.  Some in APL employ
> circumlocutions because ⍋ is slower, but it is slower
> no longer (in at least one APL :-).
>
>
>
> ----- Original Message -----
> From: Ian Clark <[email protected]>
> Date: Sunday, May 1, 2011 7:26
> Subject: Re: [Jprogramming] A permutation of i.y
> To: Programming forum <[email protected]>
>
>> Thanks, Roger.
>> I had that feeling ip was more complicated than it need be. I really
>> need to know my primitives better, every-which-way.
>>
>>
>> On Sun, May 1, 2011 at 3:17 PM, Roger Hui <[email protected]> wrote:
>> > ip is just /:
>> >
>> >   ip x=: 10?10
>> > 0 1 3 9 7 8 4 5 2 6
>> >   /: x
>> > 0 1 3 9 7 8 4 5 2 6
>> >
>> > If you substitute then tacitize, ip@baa becomes one
>> > of the Rich/Boss creations of earlier today.
>> >
>> >
>> >
>> > ----- Original Message -----
>> > From: Ian Clark <[email protected]>
>> > Date: Sunday, May 1, 2011 7:12
>> > Subject: Re: [Jprogramming] A permutation of i.y
>> > To: Programming forum <[email protected]>
>> >
>> >> ...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
>
> ----------------------------------------------------------------------
> 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