Reading about dyadic /: made me realize I didn't answer your challenge:
B=:'I was sloppy before.'
f=:/:
g=:/: { ]
h=:f;g
h B
┌─────────────────────────────────────────────────┬────────────────────┐
│1 5 12 19 0 3 13 14 18 15 7 8 16 9 10 17 4 6 2 11│ .Iabeefloopprsswy│
└─────────────────────────────────────────────────┴────────────────────┘
Linda
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Roger Hui
Sent: Wednesday, March 05, 2014 11:28 PM
To: Programming forum
Subject: Re: [Jprogramming] a good bar bet!
You use s=:/:~x to get the sort and g=:/:x to get the grade. It's faster
than s=:x{~g=:/:x . (That's the bar bet.) Counter-intuitive to anyone who
thinks indexing is always faster than sorting, or that sorting is
necessarily an expensive slow operation.
Knowing this is a strong hint on how to find the minimum of x faster than
the conventional implementation. Without this hint, even expert C
programmers (the ones I asked) can't solve the puzzle. And I mean EXPERT
in capital letters.
APL/J as a tool of thought:
<./x ←→ 1 i.~ 1 x}M⍴0
⌊/x ←→ b⍳1 ⊣ b[x]←1 ⊣ b←M⍴0
On Wed, Mar 5, 2014 at 8:18 PM, Linda Alvord <[email protected]>wrote:
> But if you use dyadic /: you won't get g , will you? I'm looking
> forward to reading all the quotes again.
>
> Linda
>
>
> -----Original Message-----
> From: [email protected] [mailto:
> [email protected]] On Behalf Of Roger Hui
> Sent: Wednesday, March 05, 2014 11:00 PM
> To: Programming forum
> Subject: Re: [Jprogramming] a good bar bet!
>
> I respectfully suggest you study the dyad /: . The fact that the dyad /:
> is defined to do what it does is one of Ken Iverson's
> masterstrokes<http://keiapl.org/anec/#sort>
> .
>
>
>
> On Wed, Mar 5, 2014 at 7:46 PM, Linda Alvord <[email protected]
> >wrote:
>
> > For me slow J is fast enough, but I really was delighted when this
> worked
> > at all. No doubt it is slow.
> >
> >
> > ]A=:?10$100
> > 63 92 51 92 39 15 43 89 36 69
> > f=:/:
> > g=:/: { ]
> > h=:f;g
> > h A
> > --------------------T-----------------------------┐
> > │5 8 4 6 2 0 9 7 1 3│15 36 39 43 51 63 69 89 92 92│
> > L-------------------+------------------------------
> >
> > Linda
> >
> >
> >
> > -----Original Message-----
> > From: [email protected]
> > [mailto:[email protected]] On Behalf Of Roger Hui
> > Sent: Wednesday, March 05, 2014 8:45 PM
> > To: Programming forum
> > Subject: Re: [Jprogramming] a good bar bet!
> >
> > It's necessary to have the g because I asked for both the sort (s) and
> the
> > grade, which would be the g.
> >
> > The problem arose in an application where the sort and the grade are used
> > for something else.
> >
> >
> >
> > On Wed, Mar 5, 2014 at 4:32 PM, Don Kelly <[email protected]> wrote:
> >
> > > Why is it necessary to have 'g'
> > >
> > > repeating the process on my machine which is obviously slower gives
> an
> > > insignifcant time difference.
> > >
> > > 20 timer 's=:/:~x [ /:x'
> > >
> > > 0.172937
> > >
> > >
> > > 20 timer 's=:/:~x [ g=:/:x'
> > >
> > > 0.173672
> > >
> > > Is it because storage is necessary and it is just as fast to store to a
> > > named location rather than to some temporary storage?
> > > Space differences seem small.
> > >
> > > Don Kelly
> > >
> > >
> > > On 05/03/2014 12:11 PM, Joe Bogner wrote:
> > >
> > >> Yes, the grade is done regardless. Here's my reasoning: In the
> > >> incumbent version, s is taken from the grade with from { which is
> > >> slower than just resorting.
> > >> It seems like the difference between sorting and selecting by indexes.
> > >> I am surprised if that's the answer though because selecting by index
> > >> should be fast since it's a contiguous array.
> > >>
> > >> jtifrom looks more complicated than jtsortc but I haven't been able to
> > >> figure out how jtsortc works.
> > >>
> > >> On Wed, Mar 5, 2014 at 2:50 PM, Roger Hui <[email protected]>
> > >> wrote:
> > >>
> > >>> x=: a.{~ 1e7 ?@$ 256
> > >>> timer=: 6!:2
> > >>>
> > >>> 10 timer 's=:x{~g=:/:x'
> > >>> 0.136961
> > >>> 10 timer 's=:/:~x [ g=:/:x'
> > >>> 0.0765459
> > >>>
> > >>> 10 timer '/:~x'
> > >>> 0.012887
> > >>> 10 timer 'x{~g'
> > >>> 0.065751
> > >>> 10 timer '/:x'
> > >>> 0.0606987
> > >>>
> > >>>
> > >>>
> > >>> On Wed, Mar 5, 2014 at 11:45 AM, Roger Hui <
> [email protected]>
> > >>> wrote:
> > >>>
> > >>> That's my alternative faster expression as well. But the more
> > >>>> interesting
> > >>>> question is, why is it faster? Since we do the grade in both cases,
> > the
> > >>>> comparison is between /:~x and g{x (or x{~g) with g pre-computed.
> The
> > >>>> answer does not depend knowledge specific to J.
> > >>>>
> > >>>>
> > >>>>
> > >>>>
> > >>>>
> > >>>> On Wed, Mar 5, 2014 at 11:38 AM, Joe Bogner <[email protected]>
> > >>>> wrote:
> > >>>>
> > >>>> Sorting and grading separately seems faster
> > >>>>>
> > >>>>> timer=: 6!:2
> > >>>>> x=:(1e7 $ 26?26) { 'abcdefghijklmnopqrstuvwxyz'
> > >>>>> NB. incumbent
> > >>>>> timer 's=: x{~g=: /:x'
> > >>>>> 0.0914002
> > >>>>>
> > >>>>> NB. alternate
> > >>>>> timer 'S=: /:~x[G=: /:x'
> > >>>>> 0.0668677
> > >>>>>
> > >>>>> s-:S
> > >>>>> 1
> > >>>>> G-:g
> > >>>>> 1
> > >>>>>
> > >>>>>
> > >>>>> I am speculating that sorting does it in place? which is faster
> than
> > >>>>> the selection from the grade
> > >>>>>
> > >>>>>
> > >>>>>
> > >>>>> On Wed, Mar 5, 2014 at 2:02 PM, Raul Miller <[email protected]
> >
> > >>>>> wrote:
> > >>>>>
> > >>>>>> Hmm...
> > >>>>>>
> > >>>>>> G=:a.i.S=:/:~x
> > >>>>>> is faster.
> > >>>>>>
> > >>>>>> But while s-:S, g and G are different.
> > >>>>>>
> > >>>>>> So I'm drawing a blank here, on how to make the grade.
> > >>>>>>
> > >>>>>> Thanks,
> > >>>>>>
> > >>>>>> --
> > >>>>>> Raul
> > >>>>>>
> > >>>>>>
> > >>>>>>
> > >>>>>> On Wed, Mar 5, 2014 at 1:52 PM, Roger Hui <
> > [email protected]>
> > >>>>>>
> > >>>>> wrote:
> > >>>>>
> > >>>>>> Suppose x is a long vector of characters and you need both its
> sort
> > >>>>>>>
> > >>>>>> and its
> > >>>>>
> > >>>>>> grade. Can you do it faster than s=: x{~g=: /:x ?
> > >>>>>>>
> > >>>>>>> Posed this way, the answer is of course yes. But how, and why is
> > it
> > >>>>>>> faster?
> > >>>>>>> ------------------------------------------------------------
> > >>>>>>> ----------
> > >>>>>>> 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
> > >>
> > >>
> > > ----------------------------------------------------------------------
> > > 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
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm