gpt4 book ai didi

lisp - 获取彩票号码

转载 作者:太空宇宙 更新时间:2023-11-03 18:46:49 25 4
gpt4 key购买 nike

作为学习 Lisp 的一部分,我目前正在尝试编写一个函数来帮助我填写彩票。我希望该函数返回

  • 一个列表
  • 六个数字,
  • 每个数字都在 1 到 49 之间,
  • 没有重复的数字,
  • 并且是升序排列的列表。

到目前为止,我已经完成了五个要求中的四个。这是我当前的代码:

(defun lottery ()
(sort (loop repeat 6 collect (1+ (random 49))) #'<))

当我运行这个函数时,我得到如下信息:

(lottery)
;; => (3 10 23 29 41 43)

基本上,一切都很好 - 除了有时我在列表中有两次完全相同的数字。在这里它开始变得令人费解。我的问题是我不太确定如何以 Lisp 方式解决这个问题。我可以想到多种选择:

  • 对结果运行remove-duplicates,然后使用length检查列表是否少于六个元素,如果是,运行lottery 第二次, append 它到第一个结果,使用 subseq 只得到前六个元素,然后重复。这行得通,但不是很优雅,尤其是当它涉及到 sorting & co 时。多次。
  • 从一个空列表开始,使用 (1+ (random 49)) 创建一个随机数,然后调用 pushnew。现在用列表递归调用 lottery,直到 length 返回 6。我更喜欢这种方法,但我仍然不太相信,因为这样我需要两个函数:一个外部函数 lottery 和一个内部函数,它被递归调用并处理列表作为参数。
  • 从哈希表开始,使用从 1 到 49 的数字作为键,并将键的值设置为 nil。然后,在一个循环内,获取 1 到 49 之间的随机数,并将相应键的值更改为 t。一旦哈希表的六个元素具有 t 作为值,就返回一次。恕我直言,这是迄今为止最糟糕的方法,因为它会大量浪费内存并且扩展性不好。

您如何看待这些选项,还有其他实现方法吗?高级 Lisp 开发人员会如何解决这个问题?

有什么提示吗?

最佳答案

创建一个从 1 到 49 的所有数字的列表,洗牌,取 6,排序。

=> (sort (take 6 (shuffle (range 1 50))))
; (8 14 16 23 34 39)

原帖者补充:

只是为了展示最终的实现,我在这里添加它:

(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)
;; => (5 6 17 21 35 37)

关于lisp - 获取彩票号码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24109692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com