This explicit version is faster and much less space intensive;
same idea but the do loop avoids holding the square array.
Still no early stopping condition though:
c =: 3 : 0
m =. >./y
for_i. }.>:i.#y do.
m =. m >. >./ q =. i ([ * <./\) y
end.
)
ts'a qq' NB. qq as previous post, below
0.0316207 2.24246e7
ts'c qq'
0.0149281 28544
Thanks,
Mike
On 24/06/2017 10:09, 'Mike Day' via Programming wrote:
Having at last had a go at solving this, post breakfast (if not Brexit).
I don't think it's a new approach, but it's fairly nifty.
It considers run lengths times heights.
a =: >./^:2@:(>:@i.@# ([ * <./\) ])
qq=:1000?.1000000
a qq
7030779
ts'a qq' NB. time & space
0.0328879 2.24246e7
ts'maxsqr qq'
0.0385574 322944
So - marginally faster, but rather space intensive.
Probably better with a stopping condition, perhaps using ^:_ , rather
than
doing all possible heights, but the code would be a bit more
complicated, I think.
Cheers,
Mike
On 21/06/2017 14:12, Raul Miller wrote:
nsqr=: [ * maxbitlen@ceilpos"0 1~
maxsqr=: >./@(nsqr ~.)
---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm