Does this suffice?
pick =: [: >: (56 ?~ 5:) , (46 ?~ 1:)
pick"0 i. 6
7 51 48 55 36 19
15 16 24 38 51 6
55 47 34 4 29 30
54 1 53 29 30 42
45 15 38 46 39 16
25 32 2 51 22 4
Henry Rich
John Randall wrote:
> The Mega Millions lottery requires picking 5 distinct numbers in the
> range 1-56 and one number in the range 1-46. The verb pick below
> randomly chooses a lottery ticket, and uses verb ci from
>
> http://www.jsoftware.com/jwiki/Essays/Combination Index
>
> ci=: 4 : 0 " 1 0
> 'm n'=. x: x
> z=. 0$q=. n
> for_p. (-i.)m do.
> k=. (p,q) lead y
> y=. y-(p!q)-p!q-k
> q=. q-1+k
> z=. z,k
> end.
> z + (i.#z) + |.!.'' +/\z
> )
>
> lead=: 4 : 0
> 'm n'=. x: x
> a=. m!n
> p=. n-1
> q=. m-1
> while. p>:q do.
> j=. q+<.-:p-q
> s=. (a - m!j) - y
> if. 0 > s do. p=. j-1
> elseif. 0 < s do. q=. j+1
> elseif. 1 do. n-j return. end.
> end.
> (n-1)-p
> )
>
> pick=:3 : '>:(5 56 ci ?5!56),?46'
>
> pick"0 i.5
> 9 26 30 38 42 30
> 12 23 29 48 52 24
> 11 18 21 25 30 9
> 1 5 14 19 43 12
> 15 25 35 42 48 6
>
> I can also do it less elegantly but from first principles as
>
> pick2=:3 : 0
> a=.0$0
> while. 5>#a do. a=.~. a, ?56 end.
>> :(/:~ a),?46
> )
>
> pick2"0 i.5
> 2 32 40 45 48 1
> 7 28 29 35 54 11
> 1 26 31 41 55 3
> 3 11 29 41 43 32
> 12 20 24 27 41 9
>
> Is there a better way to do it? I can't seem to make pick tacit, and
> pick2 seems clumsy.
>
> Best wishes,
>
> John
>
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm