我将如何在 Lisp 中编写乐透代码,其中用户随机生成 1-45 之间的 6 个数字(非重复),然后输入他们自己选择的乐透号码以查看它们是否匹配,然后告诉他们它们是否“赢了还是没赢?
(defun shuffle (list)
(let ((len (length list)))
(loop repeat len
do (rotatef (nth (random len) list)
(nth (random len) list))
finally (return list))))
(defun lottery ()
(sort (subseq (shuffle (loop for i from 1 to 49 collect i))
0 6)
#'<))
(lottery)
(代码实际上是从其他作者那里拿来的这个问题:Get numbers for the lottery)
这会输出我需要的随机数,但我在获取用户输入的 6 个数字并将它们与这些数字进行比较以查看它们是否“获胜”时遇到了很多麻烦。
让我们从获取n
个非重复随机数开始。
(defun get-n-rand (n)
(loop :for i = (adjoin (1+ (random 44)) i)
:when (= (length i) n) :return i))
现在如果我们想要其中的 6 个很简单,可以编写 (get-n-rand 6)
接下来我们要检查是否可以在另一个列表中找到一个列表的每个成员。
(defun check-user-guess (guess-list actual-list)
(equal (sort guess-list #'<) (sort actual-list #'<)))
希望这涵盖了核心逻辑。输入我现在将离开,因为它已在其他答案中涵盖。
我是一名优秀的程序员,十分优秀!