Prompted by Brian, I see I've had a 'duh' moment. The looping is on the number of items in the boxed list not on items in the amend, my test case therefore only loops twice. I need to compare performance for lists of more than 2 items to get a better idea of the relative performance of looping vs not-looping.
> -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On Behalf Of Sherlock, Ric > Sent: Monday, 31 March 2008 10:26 > To: Programming forum > Subject: RE: [Jprogramming] "de-loop" amend > > Thanks to both Brian and Rob for their solutions. They both > helped me improve my understanding of working with amend. > > I was surprised to find however that the looped solution is > faster as well as leaner than the more J'ish solutions. > > ts=: 6!:2 , 7!:[EMAIL PROTECTED] > > rndidx=: 3 : 0 > nidx=.<.0.75* */$y > ~.(nidx,2)?.@:$ $y > ) > rndcnts=: # ?. */@:$ > > amendloop=: 4 : 0 > n=.'' > 'cnts idx'=. x > for_cnt. cnts do. > n=.n,< (>cnt) (<"1 cnt_index{::idx) } cnt_index{::y > end. > ) > > box_amend =: 4 : '(>{:x) (}:x) } y' > box_amendb =: 4 : '<(>1{x) (>0{x) } >y' > > LOOP=: '(contents;<idx) amendloop m' > BS=: ',(,.<"1 contents,.<"1 each idx)' > BS=: BS,'((>@[EMAIL PROTECTED])`(>@{:@[)`(>@])})each "1 ,.m' > RH1=: '((<"1 each idx) ,each <"0 contents) box_amend each m' > RH2=: '((<"1 each idx),.contents) box_amendb"1 0 m' > > m=: (1000 100$0);5000 40$0 > idx=: rndidx each m > contents=: rndcnts each idx > ts LOOP > 0.0415161703513 10857920 > ts BS > 0.0964354408172 15760576 > ts RH1 > 0.0795365751792 16462144 > ts RH2 > 0.0673653355385 14716352 > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
