Does that include drop, }. ?   I suppose it can, since we only need to move the 
pointer to the start...  I’ll check on the laptop, once I’ve done my Listener 
xwd.  

(Last week’s was the quarterly numeric puzzle,  an ingenious construction 
including among all the digits a few decimal points and solidus ( / ) for 
rationals!)

Cheers,
Mike



Sent from my iPad

> On 26 Aug 2022, at 20:36, Raul Miller <[email protected]> wrote:
> 
> Updating arrays without generating a new copy was introduce in J805 --
> https://code.jsoftware.com/wiki/System/ReleaseNotes/J805
> 
> So in J701, that approach would indeed be slower (since it's creating
> a complete copy of the array).
> 
> Also, virtual blocks (which speed up the }. approach) were introduced
> in J807. I guess I need to roll up my sleeves and do some
> benchmarking...
> 
> Thanks,
> 
> -- 
> Raul
> 
> On Fri, Aug 26, 2022 at 3:20 PM 'Mike Day' via General
> <[email protected]> wrote:
>> 
>> These seem simpler and are possibly quicker,  at least in J701 on this 
>> oldish iPad:
>>   100 (1{I.@E.) A NB. Fails if there’s no (second) 100 in A
>> 719
>>   100 ({.@}.@(I.@E.)) A NB. Returns 0 in that case
>> 719
>> Easy to correct for such errors, of course.
>> 
>> I tried
>>   A =. ?1000000#1000
>>   find2 =: 13 : 'F + ((F=.>:y i. x) }. y) i. x' NB. No direct defs in J701
>>   ts'100 find2 A'
>> 0.020555 8.39091e6
>>   ts'100 (1{I.@E.) A'
>> 0.011503 76160
>>   ts'100 ({.@}.@(I.@E.)) A'
>> 0.007626 84864
>> 
>> Speed a bit better,  space quite a lot, if happy with time & space tests.
>> 
>> Only you know if it’s wise to overwrite the first occurrence of V in A!
>> 
>> Cheers,
>> 
>> Mike
>> 
>> 
>> 
>> Sent from my iPad
>> 
>>> On 26 Aug 2022, at 19:36, Raul Miller <[email protected]> wrote:
>>> 
>>> i. returns the index of the first occurrence of a value within an array.
>>> 
>>> So, when implementing an algorithm which needs the index of the second
>>> occurrence of the value within a (large) array, we need to do some
>>> additional work.
>>> 
>>> let's say that our array is A, the value is V
>>> 
>>>  F=: A i. V   NB. the index of the first occurrence of V
>>> 
>>> What's the most efficient way of finding the second occurrence?
>>> 
>>> One possibility is
>>>  S=: (1+F) + ((1+F) }. A) i. V
>>> 
>>> Another possibility, assuming that V is numeric and not zero, would be
>>>  S=: (0 F} A) i. V
>>> 
>>> But A is large, so perhaps a faster approach would be:
>>> S=: {{ while. V~:y{A do. y=. y+1 end. y }} F
>>> 
>>> (Which has me wishing that S=: A i.!.F V would do the job, though I'm
>>> not sure that that's completely appropriate...)
>>> 
>>> But, we can probably eliminate the need to generate a copy of A with a
>>> little extra work:
>>> 
>>>  A=: 0 F} A
>>> S=: A i. V
>>> A=: V F} A
>>> 
>>> It seems to me that this is probably going to be the fastest approach.
>>> 
>>> Can anyone think of a faster approach (or something with comparable
>>> speed which isn't quite so unwieldy?)
>>> 
>>> Thanks,
>>> 
>>> --
>>> Raul
>>> ----------------------------------------------------------------------
>>> 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