2

我正在尝试在 Lisp 中创建一个(以某种方式)微妙的排序功能。我知道有 lambda 运算符可以让我的工作更轻松,但我找不到任何有用的东西,所以我希望你能帮助我。

作为输入,我有一个像这样的嵌套列表:

    ((o1 10 15 20) (o2 5 14 20) (o3 7 8 8))

输出应该是一个像这样的嵌套列表:

    ((o1 1 1 1) (o2 3 2 1) (o3 2 3 3))

更具体地说,第一个元素 fromo1与第一个元素 from 进行比较,o2并且o3返回应该是它的位置(在上面的示例中,10 大于 5 和 7,因此它将位于结果列表中的第一个位置)等等。

最高的数字将获得第一名。

(这就像一个评分功能。有些学生申请,比较他们的功能数量。功能数量最多的人将获得第一名,但在比较使用的不同技术的数量时,他可能会获得第二或第三名)。

谢谢,我希望你能帮助我

4

1 回答 1

4

进行一些探索是有必要的。

[3]> (setq a '((o1 10 15 20) (o2 5 14 20) (o3 7 8 8)))
((O1 10 15 20) (O2 5 14 20) (O3 7 8 8))

[4]> (setq b (apply #'mapcar #'list a))
((O1 O2 O3) (10 5 7) (15 14 8) (20 20 8))

[5]> (setq c (mapcar #'(lambda(x)(sort x #'>)) (cdr b)))
((10 7 5) (15 14 8) (20 20 8))

[6]> (mapcar #'(lambda(g)(cons (car g) (mapcar #'1+ 
        (mapcar #'position (cdr g) c)))) a)
((O1 1 1 1) (O2 3 2 1) (O3 2 3 3))

现在搅拌、成型并在 190 C 下烘烤直至准备就绪。

于 2013-05-29T11:29:03.803 回答