どう書く?org ;n人中m人が当選するくじ を commonlispで
例外処理はいいかげん。
なんだか汚いソースだなぁ・・・。
;;n人中m人が当選するくじ (defun make-targets(n) (let ((arr (make-array n))) (reduce #'(lambda (ar i) (if (null ar) (list "0") (append ar (list (princ-to-string (length ar)))))) arr :initial-value nil))) (defun lot(n m) (labels ((choice (vec) (elt vec (random (length vec) (make-random-state t)))) ;; (elt vec (random (length vec)))) (pick (vec item hits) (values (remove item vec) (append hits (list item)))) (lot_ (vec hits) (print vec) (if (= (length hits) m) nil (let ((item (choice vec))) (multiple-value-bind (rvec rhits) (pick vec item hits) (cons item (lot_ rvec rhits))))))) (sort (lot_ (make-targets n) nil) #'string<)))