My 2cts: https://code.jsoftware.com/wiki/Essays/Combinations
R.E. Boss -----Original Message----- From: Programming <programming-boun...@forums.jsoftware.com> On Behalf Of 'Michael Day' via Programming Sent: zondag 1 augustus 2021 19:55 To: programm...@jsoftware.com Subject: Re: [Jprogramming] Tacit hook Thanks, Bo. This variation on comb works pretty well, except it doesn't test for the empty case, ie x = 0: NB. these boolean verbs are quicker than multiply and add for this case twice =: 1 & (32 b.) or =: 23 b. Smpscomb =: 4 : 0 k=. 2^i.>:d=.y-x z=. <"0 k for. i.<: x do. z=. k or &.> ,&.>/\. twice&.> z end. #:/:~;z ) ts 6!:2 , 7!:2@] ts'3 Smps 20' 0.6071034 2.873121e8 ts'3 Smpscomb 20' 0.0001229 66976 3 (Smps -: Smpscomb) 20 1 The sort adds a little time and space; it is only necessary if you require the same ordering as your original example. Cheers, Mike On 01/08/2021 18:31, 'Bo Jacoby' via Programming wrote: > Thanks to Mike! > > comb=: 4 : 0 > > NB.*comb v combinations of size x from i.y > > comb=: 3 : 0 > > comb~ y > > : > > k=. i.>:d=. y-x > > z=. (d$<i.0 0),<i.1 0 > for. i.x do. z=. k ,.&.> ,&.>/\. >:&.> z end. > 3 comb 6 > > > > I need to study in order to make it do what I want. I am aware that my > programming is embarassingly inefficient. > Thanks to Raul! > 2 (((= +/"1) # ]) f) 6 NB. fork, not hook! > > I wonder why it is hard to code the hook. It is not important, but it is > strange. > I am studying the bessel correction. I turns out that the mean of the bessel > corrected variances of all samples is equal to the bessel corrected variance > of the population. > > E =. +/%# NB. mean > > Va =. E@:*:-*:@:E NB. Variance > > Bc =. -.&.:%@#*Va NB. Bessel corrected variance > > S =. ((((=+/"1)#])#&2#:[:i.2&^) #)#] NB. samples > > Bc n=.i.8 > > 6 > > E Bc |:4 S n > 6 > > E Bc |:5 S n > 6 > > E Bc |:6 S n > 6 > > E Bc |:7 S n > 6 > > E Bc |:8 S n > 6 > > > > > Den søndag den 1. august 2021 16.06.21 CEST skrev 'Mike Day' via > Programming <programm...@jsoftware.com>: > > Nice work, especially persuading 13 : to return a tacit version. > I had reached the same solution as Pascal Jasmin’s, so not worth a comment > in itself. > > However, it is just about worth pointing out that the filtering approach gets > expensive for larger values of y; eg 3 Smps 20 would entail filtering 2^20 > rows to obtain 1140. In that case, I reckon it’s better to use the 1s > indices provided by, eg, 3 comb 20 . > comb is in addons/stats/base/combinatorial . > > In case it matters! > > Mike > > Sent from my iPad > >> On 31 Jul 2021, at 20:48, Raul Miller <rauldmil...@gmail.com> wrote: >> >> That's a bit tricky in this case, but it can be done: >> >> First off, the problem: >> >> 13 : '(#~x=+/"1)f y' NB. select row >> 4 : '(#~x=+/"1)f y' >> >> But we can work around this by giving 13 : a variant expression: >> >> 13 : 't#~x=+/"1 t=.f y' >> [ (] #~ [ = [: +/"1 ]) [: f ] >> >> And, in this example, we can turn this into a hook through inspection: >> Smps=: (] #~ [ = [: +/"1 ]) f >> >> This could be simplified further, of course: >> 2 ((] #~ (= +/"1)) f) 6 >> and >> 2 (((= +/"1) # ]) f) 6 >> >> do the same computation. >> >> I hope this helps, >> >> -- >> Raul >> >>> On Sat, Jul 31, 2021 at 12:43 PM Srdjan Stipic <srdjan.sti...@gmail.com> >>> wrote: >>> >>> You can use “13 : ‘…’” construct to get tacit verb. >>> >>> On Sat 31. Jul 2021 at 18:00, 'Pascal Jasmin' via Programming < >>> programm...@jsoftware.com> wrote: >>> >>>> 2 ([ (] #~ [ = +/"1@:]) f@]) 6 >>>> >>>> >>>> >>>> >>>> >>>> >>>> On Saturday, July 31, 2021, 11:52:10 a.m. EDT, 'Bo Jacoby' via >>>> Programming <programm...@jsoftware.com> wrote: >>>> >>>> >>>> >>>> >>>> >>>> Consider this code >>>> >>>> f=.#&2#:[:i.2&^ NB. 0-1 rows >>>> >>>> >>>> >>>> >>>> Smps=. 4 : '(#~x=+/"1)f y' NB. select rows >>>> >>>> 2 Smps 6 NB. for example >>>> 0 0 0 0 1 1 >>>> >>>> 0 0 0 1 0 1 >>>> >>>> 0 0 0 1 1 0 >>>> >>>> 0 0 1 0 0 1 >>>> >>>> 0 0 1 0 1 0 >>>> >>>> 0 0 1 1 0 0 >>>> >>>> 0 1 0 0 0 1 >>>> >>>> 0 1 0 0 1 0 >>>> >>>> 0 1 0 1 0 0 >>>> >>>> 0 1 1 0 0 0 >>>> >>>> 1 0 0 0 0 1 >>>> >>>> 1 0 0 0 1 0 >>>> >>>> 1 0 0 1 0 0 >>>> >>>> 1 0 1 0 0 0 >>>> >>>> 1 1 0 0 0 0 >>>> >>>> >>>> >>>> I want to rewrite it tacit >>>> Smps=.((=+/)"1 f)#f@] >>>> This works but is without the hook, so "f" is repeated. >>>> How to write the hook tacitly? >>>> I believe that this is easy, but I am stuck. >>>> Thank you! >>>> Bo. >>>> >>>> >>>> >>>> >>>> ------------------------------------------------------------------- >>>> --- 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 > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm -- 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