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

Reply via email to