It is faster because it gives the entire array to the primitives, whereas x (</@:<)"0 1 a,b breaks x up into individual atoms, for each of the millions of x in the benchmark.
A generalization of this problem can be solved using the dyad I. http://www.jsoftware.com/help/dictionary/dicapdot.htm ----- Original Message ----- From: Boyko Bantchev <[email protected]> Date: Wednesday, October 28, 2009 10:13 Subject: Re: [Jprogramming] x ∈ [y1,y2) To: Programming forum <[email protected]> > Hi Kenneth, > > 2009/10/28 Lettow, Kenneth <[email protected]>: > > The equivalent phrase is: > > CO=: ({...@] <: [)*.([ < {:@]) > > A quick test shows that it is faster and almost as lean. > > ... > > Thank you for pointing out this, and strange that CO is so > much faster. Would anybody knowledgeable explain why? > > As for ‘lean’ … well, CO is a direct expression of what is wanted > (y1<=x and x<y2), so nothing to be surprised of. > Plus, it needs > operations for explicitly (albeit tacitly) accessing each of x, y1 > and y2, including extracting y1 and y2 from a vector. I wouldn't > – in an array language – call this lean :) In fact, it > would have > been more straightforward to express the same in C. > > The first variant I came up was > > w1=. (>:{.)*.(<{:) > > which is not unlike CO but simpler. Then I had > > w2=. (<{.)<(<{:) > > which is simpler yet. I was finally satisfied with > > w3=. </@:< > > Each of w1, w2, and w3 is simpler than CO, and w1 and w2 > are as fast. Only w3 is slower, for a reason that is mysterious > to me. > > I should also add that, in case it is not known which end of the > interval is the lower one, we could use a very similar verb: > > w4=. ~:/@:< > > in place of w3. > > 2.4 (~:/@:<) 2 3 > 1 > 2.4 (~:/@:<) 3 2 > 1 > ----------------------------------------------------------------- > ----- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
