Solution to the 99 LISP Problems #24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| (defun element-at (alist n)
(if (< (length alist) n)
nil
(if (= n 1)
(car alist)
(element-at (cdr alist) (1- n)))))
(defun remove-at (alist n)
(let ((i 1))
(mapcan
(lambda (x)
(let ((j i))
(setf i (1+ i))
(if (= j n) nil (list x))))
alist)))
(defun rnd-select (alist n)
(if (<= n 0)
nil
(let ((k (1+ (random (length alist)))))
(append
(list (element-at alist k))
(rnd-select (remove-at alist k) (1- n))))))
(defun lotto-select (n m)
(if (< m n)
nil
(rnd-select (range 1 m) n)))
|
Lisp dialect: Steel Bank Common Lisp