gpt4 book ai didi

list - 在 lisp 中组合两个列表以输出某些项目

转载 作者:太空宇宙 更新时间:2023-11-03 19:04:29 29 4
gpt4 key购买 nike

我目前已经解决了背包问题,并且有如下两个列表

list 1((帽子10 5)(衣服10 10)(帐篷40 70))

list 2 (((1 1 1).0) ((1 0 1) .23) ((1 0 0) .45) ((0 0 0) .0))

列表 2 表示项目是否被拿走。((1 1 1) .0) 表示所有项目都被拿走,0 表示它的有用程度。我的最终输出是二进制的,但我想知道如何创建一个函数来获取两个列表并显示实际项目,如下例所示

而不是打印 ((1 0 1) .23)打印 ((帽子帐篷) . 23))

最佳答案

如果我没理解错的话,听起来你有一个本质上是面具的列表,以及一个长度相同的项目列表,对于面具的每个元素,你想从相应的项目中收集一些东西在项目列表中。我不确定这种函数的最佳名称是什么,但这里有一个调用它的实现 decode:

(defun decode (mask items &key (key 'identity) (test 'identity))
(loop
for bit in mask
for item in items
when (funcall test bit)
collect (funcall key item)))

CL-USER> (decode '(nil t nil nil t) '(a b c d e))
; (B E)
CL-USER> (decode '(nil t nil nil t) '(a b c d e) :key 'symbol-name)
; ("B" "E")
CL-USER> (decode '(nil t nil nil t) '(a b c d e) :test 'null)
; (A C D)

将其应用于您的用例并不难;测试是掩码元素是否非零,关键函数是first,因为你想要项目的名称:

(defparameter *items*
'((hat 10 5) (clothes 10 10) (tent 40 70)))

(defparameter *solutions*
'(((1 1 1) . 0) ((1 0 1) . 23) ((1 0 0) . 45) ((0 0 0) . 0)))

(decode '(1 0 1) *items*
:key 'first
:test (complement #'zerop))
;;=> (hat tent)

(mapcar #'(lambda (solution)
(cons (decode (car solution)
*items*
:key 'first
:test (complement #'zerop))
(cdr solution)))
*solutions*)
;;=> (((HAT CLOTHES TENT) . 0) ((HAT TENT) . 23) ((HAT) . 45) (NIL . 0))

关于list - 在 lisp 中组合两个列表以输出某些项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29563451/

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