您必须编写对嵌套列表进行排序的程序或函数。以下是对嵌套列表进行排序的规则:
让我们以这个清单为例:
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
此列表中的每个元素都有一个“优先级”。元素计为数字或子列表。首先,在相同深度获得每个元素的优先级。如果元素只是数字,则其优先级与数字本身相同。如果元素是子列表,则其优先级是其中所有数字的总和,不包括任何子子列表。
因此,深度1的所有元素的优先级为:
( 7 ) 2 7 ( 3 ) 9
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
按优先级对每个元素进行排序。如果有平局,则必须保持与原始列表相同的顺序。
2 ( 3 ) ( 7 ) 7 9
(2, (2, 1, (3, 4)), (5, 2), 7, 9)
对每个子列表重复此操作。所以在这个子列表上
(2, 1, (3, 4))
我们的工作重点如下:
2 1 ( 7 )
(2, 1, (3, 4))
如此排序,看起来像:
(1, 2, (3, 4))
(3, 4)
已经排序,所以我们完成了。重复(5, 2)
产生的结果(2, 5)
,我们就完成了!我们的最终列表是:
(2, (1, 2, (3, 4)), (2, 5), 7, 9)
规则:
高度怀疑,但以防万一Mathematica为此提供了某些功能,不允许使用嵌套列表排序内置函数。定期排序功能是允许的。
I / O可以采用任何合理的格式。
每个子列表将至少包含一个数字或列表。同样,子列表可以嵌套多个级别。例如,中
(1, 2, (((3))))
的(((3)))
优先级为0,因为其中只有子列表。无效的列表(不匹配的括号,非数字,错误的括号类型,负数等)导致未定义的行为。
测试I / O:
(1, 2, 3) ---> (1, 2, 3)
(1, 2, 6, 3, 9, 8) ---> (1, 2, 3, 6, 8, 9)
(4, 3, (2), (1)) ---> ((1), (2), 3, 4)
(4, 3, (2), ((1))) ---> (((1)), (2), 3, 4)
(5, (1, 2, (9, 8))) ---> ((1, 2, (8, 9)), 5)
(3, (1, 2), (2, 1)) ---> (3, (1, 2), (1, 2))
(3, (1, 2, (99)), (2, 1, (34))) ---> (3, (1, 2, (99)), (1, 2, (34)))
(7, 2, (1, (9, 12)), (4, 3, 2, (1, 2))) ---> ((1, (9, 12)), 2, 7, (2, 3, (1, 2), 4))
以字节为单位的最短答案将获胜。