#:g1: closでL-99 (P24 ロトくじ)

Posted 2008-05-30 14:54:00 GMT

-(http://www.ic.unicamp.br/~meidanis/courses/mc336/2006s2/funcional/L-99_Ninety-Nine_Lisp_Problems.html)
以前に作成したrangeと、rnd-selectを組み合わせる、というお題です。
あまり必要ないけれどメソッド結合。
どうやら数が大きくなってしまう場合は、このお題の方法より、シャッフルして先頭のN個を取得、という風にした方が速いみたいです…。

(defgeneric lotto-select (n range)
  (:documentation
   "P24 (*) Lotto: Draw N different random numbers from the set 1..M.
 The selected numbers shall be returned in a list."))

(defmethod lotto-select :around ((n integer) (range integer)) (and (<= 1 n range) (call-next-method)))

(defmethod lotto-select ((n integer) (range integer)) (rnd-select (coerce (vec-from-1-to range) 'list) n))

(defun vec-from-1-to (end) (declare ((integer 1 *) end)) (loop :with res := (make-array end) :for i :from 0 :below end :do (setf (svref res i) (1+ i)) :finally (return res)))


comments powered by Disqus