Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-05-30

CLOSでL-99 (P24 ロトくじ)

| 23:54 | CLOSでL-99 (P24 ロトくじ) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSでL-99 (P24 ロトくじ) - わだばLisperになる

以前に作成した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)))