From: Marco Antoniotti
Subject: Re: Another From the Trenches Kenny Gotta Be a Better Way Challenge
Date: 
Message-ID: <77849495-5107-4f4d-887a-ac08f919f5d0@d45g2000hsc.googlegroups.com>
On Mar 22, 8:04 am, William James <·········@yahoo.com> wrote:
> On Mar 21, 3:58 pm, Ken Tilton <···········@optonline.net> wrote:
>
>
>
> > (let* ((nums (list 0 1 2 3 4 5 6 7))
> >        (used (make-array (length nums)
> >                :element-type 'bit
> >                :initial-element 0)))
> >    (labels ((show-one (depth)
> >               (when (find 0 used)
> >                 (let ((one (loop thereis
> >                                  (loop for n in nums
> >                                      unless (= 1(bit used n))
> >                                      when (zerop (random (length nums)))
> >                                      return n))))
> >                   (print one)
> >                   (setf (bit used one) 1)
> >                   (show-one (1+ depth))))))
> >      (show-one 0)))
>
> > This is somewhat distorted, but the labeled fn show-one is what I really
> > have to do: given a mask and a list of numbers some of whom have already
> > been "used" indicated by (= 1 (bit mask <that number>)), pick a number
> > at random from those still unused. Without consing.
>
> > In case it is confusing above, in reality there will be just a dozen
> > random numbers under about 5000,
>
> Ruby
>
> nums = 60,184,1590,1660,1929,2168,2907,3270,3447,3572,3620,3788
> used = 184,2907,3788
>
> unused = nums - used
> p unused[ rand( unused.size ) ]

Your solution is

(defvar nums (list 60 184 1590 1660 1929 2168 2907 3270 3447 3572 3620
3788))
(defvar used (list 184 2907 3788))
(defvar unused (set-difference nums used))

(nth (random (length unused)) unused)

Not much different.  But that may not be what Kenny wanted.

Cheers
--
Marco
From: Ken Tilton
Subject: Re: Another From the Trenches Kenny Gotta Be a Better Way Challenge
Date: 
Message-ID: <47e4dff6$0$25027$607ed4bc@cv.net>
> On Mar 22, 8:04 am, William James <·········@yahoo.com> wrote:
> 
>>On Mar 21, 3:58 pm, Ken Tilton <···········@optonline.net> wrote:
>>
>>
>>
>>
>>>(let* ((nums (list 0 1 2 3 4 5 6 7))
>>>       (used (make-array (length nums)
>>>               :element-type 'bit
>>>               :initial-element 0)))
>>>   (labels ((show-one (depth)
>>>              (when (find 0 used)
>>>                (let ((one (loop thereis
>>>                                 (loop for n in nums
>>>                                     unless (= 1(bit used n))
>>>                                     when (zerop (random (length nums)))
>>>                                     return n))))
>>>                  (print one)
>>>                  (setf (bit used one) 1)
>>>                  (show-one (1+ depth))))))
>>>     (show-one 0)))
>>
>>>This is somewhat distorted, but the labeled fn show-one is what I really
>>>have to do: given a mask and a list of numbers some of whom have already
>>>been "used" indicated by (= 1 (bit mask <that number>)), pick a number
>>>at random from those still unused. Without consing.
>>
>>>In case it is confusing above, in reality there will be just a dozen
>>>random numbers under about 5000,
>>
>>Ruby
>>
>>nums = 60,184,1590,1660,1929,2168,2907,3270,3447,3572,3620,3788
>>used = 184,2907,3788

WJ: That is not a mask. A mask would be 10010101010100110010101010... 
with bit 184 telling me if 184 had been used etc.

The mask will be thousands of bits long.

To generate your used list one would have to cons it up. This is a 
massively heavy hit task, lets not cons.

kt

-- 
http://smuglispweeny.blogspot.com/
http://www.theoryyalgebra.com/

"In the morning, hear the Way;
  in the evening, die content!"
                     -- Confucius