【问题标题】:Programming a lotto in Lisp在 Lisp 中编程乐透
【发布时间】:2015-04-02 10:50:28
【问题描述】:

我将如何在 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 个数字的用户输入并将它们与这些数字进行比较以查看它们是否“获胜”时遇到了很多麻烦。

【问题讨论】:

  • 请将代码缩进 4 个空格。
  • 欢迎您!我已经编辑了你的帖子。正如@Carcigenicate 指出的那样,您可以通过缩进4 个空格来获取code markdown 中的代码。您可能想为代码添加更多格式 - 只需确保每行代码都缩进 4 个空格。祝你好运!
  • 看起来你从另一个问题中获取了代码。
  • 看起来您从另一个问题的答案中获取了代码,未能读取纠正有缺陷的随机播放的 cmets,并将其包装成一个琐碎的“如何用这个编写程序”问题。跨度>

标签: lisp common-lisp


【解决方案1】:

让我们从获取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 #'<)))

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

【讨论】:

  • 实际运行时遇到问题“检查用户猜测”我如何正确调用它? (check-user-guess 1 2) 或类似的东西?
  • (check-user-guess '(1 2 3 4) '(3 2 4 1)) 给出 T 所以你可以有 (check-user-guess (get-n-rand 6) (get-users-guesses)) .. 假设 get-user-guesses 返回用户选择的数字列表
【解决方案2】:

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

(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...")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多