我试图在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))
更具体地说,o1
中的第一个元素与o2
和o3
中的第一个元素进行比较,返回应该是它的位置(在上例中,10是大于5和7因此它将位于结果列表中的第一个位置上)等等。
最高的数字将获得第一名。
(它就像一个分数功能。一些学生制作一个应用程序,他们的功能数字进行比较。功能数量最多的那个将获得第一名,但是当比较使用的不同技术的数量时,他可能获得第二名或第三名)。
谢谢,我希望你能帮助我
答案 0 :(得分: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搅拌,成型和烘烤,直到准备好。