我想在LISP中定义一个坚持这个公式的新排序方法。
2> 3> 4> 5> 6> 7> 8> 9> 10> J> Q> K>甲
在扑克中看到。
例如,我就这样称呼它:
(mysortmethod '((3 H)(2 H)(J D)(8 C)(5 C)))
我会得到这个:
((2 H)(3 H)(5 C)(8 C)(J D))
作为排序列表,其中忽略每个括号中的第二个元素。
我完全不知道该怎么做。有人能指出我正确的方向或者向我解释一个方法吗?
答案 0 :(得分:5)
这是一种非常标准的Lisp练习。首先,您需要一种方便的方法来确定排序。一个简单的方法是保持一个点的序列(如果你有很多,可能是一个哈希表映射点到位置会更好)和一个比较它们的位置的函数:
(defconstant +pips+ #(2 3 4 5 6 7 8 9 10 J Q K A))
(defun pip< (pip1 pip2)
(< (position pip1 +pips+)
(position pip2 +pips+)))
然后你可以使用标准的sort功能(记住它具有破坏性,所以保存结果,不要用引用的数据来调用它,因为你不应该修改它文字数据),将 pip&lt; 作为谓词并将first作为关键字,因为您使用first从每张卡片中获取点数(因为您正在表示)卡片作为一个点子和一套西装的名单):
CL-USER> (let ((hand (copy-tree '((3 H)(2 H)(J D)(8 C)(5 C)))))
(sort hand 'pip< :key 'first))
;=> ((2 H) (3 H) (5 C) (8 C) (J D))