Thanks for the tip about the precomputed values, I should have done it
to be fair, since I use it in my Perl comparison, but I forgot as I'm
concentrating on learning J here...  It does indeed bring a big speedup,
although I'm pretty sure that my integer-splitting method is a quite a
bit faster than the one you suggest.

I like the idea of using rank 1 rather than transpose.

Anyway, fastest I've got so far, and quite an acceptable result to me
would now be
specialX -. = +/"1@({&f)@(10&#.inv)
if only I could sort out the leading zero problem.  Your
character-oriented splitting fixes it, but doubles+ the execution time.

Finding specialX <10e5 now <2 seconds on my ARM 260 (vs 28 for Perl) (6"
using char-splitting)
Finding specialX <10e6 now <2 seconds on my desktop (4" using
char-splitting)

Anyway, been quite an experience thanks to all for their input.




On Sun, 2010-08-29 at 13:32 -0400, Marshall Lochbaum wrote:
> By the way, if you want to add up the array of (+!)s of digits, you should
> use +/"1 instead of +/@:|:  . It's much faster and prettier.
> 
> Marshall
> 
> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]] On Behalf Of Alex Gian
> Sent: Sunday, August 29, 2010 12:05 PM
> To: Programming forum
> Subject: Re: [Jprogramming] Splitting an integer into its digits
> 
> Hi Ric and all,
> 
> There's one more thing I'd like to mention, now that I got this 'rank'
> thing sorted:
> 
> I don't know if you noticed, but adding "0 to the 'digits' verb, has some
> interesting, and IMHO not very acceptable effects on time and space taken.
> 
> For instance, finding specials <10e5 is instantaneous on my desktop machine
> without the "0, yet takes about 7 seconds when done the other way.  in the
> process it uses all of my 2Gb memory!
> (OK, without the "0 means using the ugly transpose method AND getting the
> wrong results for leading zeros, but still.  I guess J really does prefer
> big arrays!!) Trying to find all specials <10e6, eats up all mem PLUS my 6Gb
> swap space without achieving a result.  Without the "0 I get the result 1n 2
> seconds, albeit with the wrong value for numbers with leading-zeros.
> 
> On my PDA (Acer n30, which is my main J learning platform), it doesn't even
> finish without the "0, complains it's out of memory.  
> I dragged out my old Jornada 928 (J502) and it managed to finish here,
> probably a bit more memory available.  Took 18 seconds on what is basically
> a 206MHz ARM.  
> In comparison, my Nokia 770, with a 260MHZ ARM, solves the same problem
> iteratively, in Perl, in 28 seconds, without taking any space at all.
> 
> I don't think this reflects too well on J.  I suppose what I'm asking
> is:  is there another (neat J-like) way to do searches, other than using #
> over huge arrays, that would take up little (preferably constant) space for
> this class of problems?
> 
> 
> 
> 
> On Sun, 2010-08-29 at 02:35 +1200, Sherlock, Ric wrote:
> 
> > If you add the "0 to digits, you don't need to use the transpose because
> +/ is only ever getting fed a list (rank 1). 
> > 
> >    digits=: 10&#.^:_1"0
> >    fp1=: + !
> >    spsum=: +/@f...@digits
> >    special=: = spsum
> >    (#~ special)  1974 123 85837 408297
> > 85837 408297
> > 
> >    special f.
> > = +/@(+ !)@(10&#.^:_1"0)
> > 
> > IOW a one-liner for special would be:
> >    special2=: = +/@(+ !)@(10&#.^:_1"0)
> >    (#~ special2) 1974 123 85837 408297
> > 85837 408297
> > 
> > ----------------------------------------------------------------------
> > 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