lisp - 用 Lisp 编程乐透

标签 lisp common-lisp

我将如何在 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 #'<)))

希望这涵盖了核心逻辑。输入我现在将离开,因为它已在其他答案中涵盖。

关于lisp - 用 Lisp 编程乐透,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29411099/

相关文章:

lisp - Euler #2 尝试后出现 Bignum 溢出错误

dictionary - 我什么时候会使用 mapc 而不是 mapcar?

macros - &lisp 宏中的可选参数 : Why does this variable behave like this?

tree - 树中的最小元素

recursion - 如何评估递归宏定义

lisp - "my other car is a cdr"是什么意思?

compiler-construction - 是否有针对不同 "RnRS"方案标准的摘要?

web-services - 在长期运行的Common Lisp应用程序中,应使用什么策略来管理垃圾?

random - Common Lisp 随机骰子

clojure - 无法更改/建立 : [some-def] with set in Clojure 的根绑定(bind)