小编典典

代码高尔夫:将多个排序列表合并为一个排序列表

algorithm

实现一种算法,将任意数量的排序列表合并到一个排序列表中。目的是创建您喜欢的任何语言的最小的工作程序。

例如:

input:  ((1, 4, 7), (2, 5, 8), (3, 6, 9))
output: (1, 2, 3, 4, 5, 6, 7, 8, 9)

input:  ((1, 10), (), (2, 5, 6, 7))
output: (1, 2, 5, 6, 7, 10)

注意 :连接输入列表然后使用语言提供的排序功能的解决方案不符合高尔夫精神,因此不会被接受:

sorted(sum(lists,[])) # cheating: out of bounds!

除了别的什么,您的算法 应该 (但不一定必须)更快!

清楚地说明语言,任何脆弱性和字符数。仅在计数中包含有意义的字符,但是出于艺术性/可读性的目的,可以随意在代码中添加空格。

为了使内容整洁,建议在评论中进行改进或在适当的地方通过编辑答案,而不是为每个“修订”创建新的答案。

编辑
:如果我再次提交此问题,我将在“不提供语言排序”规则上扩展为“不将所有列表连接在一起然后对结果进行排序”。现有的条目然后进行排序实际上是非常有趣且紧凑的,因此,我不会追溯地介绍它们被打破的规则,但是可以随意处理新提交的更严格的规范。



阅读 270

收藏
2020-07-28

共1个答案

小编典典

Common Lisp
merge在语言标准中已经具有通用序列的功能,但仅适用于两个序列。对于升序排列的多个数字列表,可以在以下功能中使用它(97个基本字符)。

(defun m(&rest s)
  (如果(不是(cdr s))
      (汽车)
      (应用#'m
             (cons(合并'list(car s)(cadr s ## <))
                   (cddr s)))))

编辑 :过一段时间后再访问:可以在一行中完成:

(defun multi-merge (&rest lists)
  (reduce (lambda (a b) (merge 'list a b #'<)) lists))

它有79个具有有意义名称的基本字符,将它们简化为一个字母,结果为61:

(defun m(&rest l)(reduce(lambda(a b)(merge 'list a b #'<))l))
2020-07-28