用Lisp编写乐透

用Lisp编写乐透,lisp,common-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)) f

我如何用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)
(取消无序排列(列表)
(let((len(长度列表)))
(循环重复透镜
do(旋转因子(第n个(随机透镜)列表)
(第n个(随机长度)列表)
最后(返回列表)))
(德芬彩票)
(排序(subseq(洗牌(循环从1到49收集i))
0 6)

#“如果您的问题是输入,这应该是(不安全的)解决方案:

(defun play-lotto (&aux list)
  (dotimes (i 6)
    (loop
       (princ "Write a Integer between 0 and 50: ")
       (let ((number (read)))
         (if (and (integerp number) (< 0 number 50))
             (if (member number list)
                 (progn 
                   (princ "You can only choose a number once")
                   (terpri))
                 (progn
                   (push number list)
                   (return)))
             (progn
               (princ "Not a Integer between 0 and 50")
               (terpri))))))
  (if (equal (sort list #'<) (lottery))
      (princ "You won!")
      (princ "You lost...")))
(取消玩乐透(&aux列表)
(多时)(i 6)
(环路
(普林斯“写一个介于0和50之间的整数:”)
(让((数字(读取)))
(如果(和(整数编号)(<0编号50))
(如有)(会员编号列表)
(项目
(原则“您只能选择一个数字一次”)
(i)
(项目
(推送号码列表)
(返回)
(项目
(原则“不是0到50之间的整数”)
(解释(())(())))

(如果(相等)(排序列表#’如果您的问题是输入,则应为(不安全)解决方案:

(defun play-lotto (&aux list)
  (dotimes (i 6)
    (loop
       (princ "Write a Integer between 0 and 50: ")
       (let ((number (read)))
         (if (and (integerp number) (< 0 number 50))
             (if (member number list)
                 (progn 
                   (princ "You can only choose a number once")
                   (terpri))
                 (progn
                   (push number list)
                   (return)))
             (progn
               (princ "Not a Integer between 0 and 50")
               (terpri))))))
  (if (equal (sort list #'<) (lottery))
      (princ "You won!")
      (princ "You lost...")))
(取消玩乐透(&aux列表)
(多时)(i 6)
(环路
(普林斯“写一个介于0和50之间的整数:”)
(让((数字(读取)))
(如果(和(整数编号)(<0编号50))
(如有)(会员编号列表)
(项目
(原则“您只能选择一个数字一次”)
(i)
(项目
(推送号码列表)
(返回)
(项目
(原则“不是0到50之间的整数”)
(解释(())(())))

(如果(相等)(排序列表#’让我们从获取非重复随机数开始

(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 #'<)))
(取消选中用户猜测(猜测列表实际列表)

(相等(排序猜测列表#’让我们从获取非重复随机数开始

(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 #'<)))
(取消选中用户猜测(猜测列表实际列表)

(相等(sort guess list#'请将您的代码缩进4个空格。欢迎!我编辑了您的帖子。您可以通过将代码缩进4个空格来获得
code markdown
,正如@Carcigenicate所指出的。您可能想在代码中添加更多的格式-只需确保每行代码都缩进4个空格。祝您好运!可能还有兴趣:Looks like you从另一个问题中获取了代码。看起来您从另一个问题的答案中获取了代码,但未能阅读纠正错误的无序排列的注释,并将其包装为一个微不足道的“如何使用此编写程序”问题。请将您的代码缩进4个空格。欢迎!我已经编辑了您的帖子。您可以通过将代码缩进4个空格来获得
代码标记
,正如@Carcigenicate所指出的。您可能需要在代码中添加更多的格式-只需确保每行代码都缩进4个空格。祝您好运!可能还有一点有趣:看起来像您一样确定另一个问题的代码。看起来您从另一个问题的答案中提取了代码,未能阅读纠正有缺陷的无序排列的注释,并将其包装到一个琐碎的“如何使用此问题编写程序”问题中。实际运行“检查用户猜测”时遇到问题,如何正确调用它?(检查用户猜测1 2)或者类似的东西?
(check user guess'(1 2 3 4);(3 2 4 1))
给出
T
,所以你可以有
(check user guess(get-n-rand 6)(get users guess))
。假设get user guess返回一个用户选择的数字列表,而用户在实际运行“check user guess”时遇到问题我如何正确地命名它?(检查用户猜测12)或者类似的东西?
(检查用户猜测(1234)-(32411))
给出
T
,这样你就可以有
(检查用户猜测(get-n-rand 6)(get-users猜测))
。假设get-user猜测返回用户选择的数字列表