Oops! should have been timespacex '100 findxth 1;A'
0.0925588 1.35533e8 On Tue, Aug 30, 2022 at 8:02 AM Don Guinn <dongu...@gmail.com> wrote: > NB. Find the index of some instance of a value > > findxth=:4 : 0 > > 'value list'=.y > > try. x{,4$.$.value=list > > catch. _1 > > end. > > ) > > _20,\z=:?.100#10 > > 4 6 8 6 5 8 6 6 6 9 3 2 3 1 9 2 7 0 9 5 > > 7 7 9 7 4 8 7 4 2 1 1 0 4 3 9 3 2 7 4 4 > > 0 3 7 5 9 6 3 2 8 2 0 3 5 4 0 0 3 1 5 0 > > 4 0 2 9 2 4 0 0 7 7 5 7 3 1 6 3 1 5 8 9 > > 8 5 3 9 9 8 9 5 1 1 0 4 1 7 3 2 3 4 0 4 > > NB. Find index of the second occurence of 2 > > 1 findxth 2;z > > 15 > > NB. Find index of the third from last of 7 > > _3 findxth 7;z > > 69 > > NB. Try to find index of the tenth of 5 but does not exist > > 9 findxth 5;z > > _1 > > NB. find the index of the middle or next to middle 8 > > ({~<.@-:@#),4$.$.8=z > > 48 > > A=. ?. 1e8#1e3 > > 100 (2 i.~ +/\)@:E. A > > 1599 > > timespacex '100 (2 i.~ +/\)@:E. A' > > 0.213069 1.20796e9 > > timespacex '100 findxth 2;A' > > 0.0890775 1.35533e8 > > > On Mon, Aug 29, 2022 at 6:32 PM 'Pascal Jasmin' via General < > gene...@jsoftware.com> wrote: > >> I thought that perhaps this could be fast: >> >> A=. ?. 1e8#1e3 >> >> timespacex '100 (2 i.~ +/\)@:E. A' NB. or = instead of E. >> 0.460527 1.20796e9 >> >> >> This application happens to everyone at least once, if >> >> (u { I.@E.) >> >> had special code where the result of u (or simply m) is presumed (for >> speed optimization) to be a list/atom of top (rather than last) occurrences >> of matches. >> >> >> Here is a dyad that returns the xth occurrences (indexes) of x in y if >> they exist. where x is in format x (, or ;) m where m is the list of >> indexes requested. >> >> It is a bit slow due to the y =. n }. y step. >> >> xm =: {. ,&boxopen }. NB. split arguments as head ; tail. assignment as >> 'h t' =. xm y >> >> findxth =: 4 : 0 >> >> 'x m' =. xm x NB. m is sorted list of find indexes. x is match value. >> if. 0 = #m do. m =. 0 end. >> acc =. i.0 >> oset =. 0 >> >> for_i. i. >./ m do. >> >> idx =. x i.~ y >> >> if. idx = # y do. acc return. end. >> >> if. i e. m do. acc =. acc , oset + idx end. >> >> oset =. oset + >: idx >> >> y =. (>: idx) }. y >> >> end. >> >> acc , oset + x i.~ y >> >> ) >> >> 1 1 3 4 6 findxth 0 1 0 0 1 0 1 1 1 >> >> 4 7 8 >> >> (1 ; 1 3 4 6) findxth 0 1 0 0 1 0 1 1 1 >> >> 4 7 8 >> >> 1 findxth 0 1 0 0 1 0 1 1 1 >> >> 1 NB. m is 0 (first item) if omitted. >> >> >> 5 {. 100 I.@E. A >> >> 990 1599 2797 4550 5073 >> >> 100 0 1 4 findxth A >> >> 990 1599 5073 >> >> >> On Friday, August 26, 2022 at 05:27:46 p.m. EDT, Devon McCormick < >> devon...@gmail.com> wrote: >> >> >> >> >> >> I get these timings on J 9.04: >> >> A=. ?1e8#1e3 >> ts '100 find2 A' >> 2.4e_6 1536 >> ts '100 (1{I.@E.) A' >> 0.19722 8.39853e6 >> ts '100 ({.@}.@(I.@E.)) A' >> 0.200139 8.39866e6 >> (100 find2 A) -: 100 (1{I.@E.) A >> 1 >> find2 >> ([: >: i.~) + [ i.~ ] }.~ [: >: i.~ >> >> >> On Fri, Aug 26, 2022 at 3:53 PM 'Mike Day' via General < >> gene...@jsoftware.com> wrote: >> >> > 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 <rauldmil...@gmail.com> 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 >> > > <gene...@jsoftware.com> 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 <rauldmil...@gmail.com> >> 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 >> > >> >> >> -- >> >> Devon McCormick, CFA >> >> Quantitative Consultant >> >> ---------------------------------------------------------------------- >> 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