“排序”算法


33

有一种“排序算法”,有时也称为Stalin排序,在该算法中,为了对列表进行排序,您只需从列表中删除元素,直到其按升序进行排序即可。例如清单

[1, 2, 4, 5, 3, 6, 6]

当使用斯大林排序进行“排序”时

[1, 2, 4, 5, 6, 6]

这三个被删除,因为它故障。

现在显然有许多方法可以删除元素以对列表进行排序。例如,任何少于两个元素的列表都必须进行排序,因此只要盲目地删除足够的元素,我们就可以对列表进行排序。既然是这种情况,我们只在乎斯大林排序可能的最长结果。

您的任务将是获取一个正整数列表,并输出可以通过从原始列表中删除元素而得出的最长排序(递增)列表的长度。那就是找到最长排序的(可能是非连续的)子列表的长度。

排序的列表可以连续多次具有相同的元素。除非程序本身为空,否则不需要支持空列表。

计分

您的答案将根据其可能的最长斯大林排序长度进行评分。程序将被解释为字节序列而不是字符序列,并且它们的顺序将是通过将字节解释为数字而产生的自然顺序。分数越低越好。

这不是

这是一个简洁的工具,可帮助您对答案进行评分。

测试用例

[1, 2, 4, 5, 3, 6, 6] -> 6
[19, 2] -> 1
[3, 3, 4, 3] -> 3
[10] -> 1
[1, 2, 4, 9] -> 4
[1, 90, 2, 3, 4, 5] -> 5
[1, 90, 91, 2, 3, 4, 5] -> 5

3
简而言之:输出最长(非严格)增加序列的长度。
user202729 '18

1
我喜欢规则“除非程序本身为空,否则您不需要支持空列表”。
圣保罗Ebermann

这个挑战让我想起了很多dropsort挑战:codegolf.stackexchange.com/questions/61808/…–
Stefnotch,

1
我在ptpb.pw/SVSt.html进行了检查。仍然不是很实用,但是可以。(TODO:*条形图*划分为最少递减的序列*支持其他代码页)
user202729 '18

@ user202729酷!我已将其添加到帖子中。如有必要,请随时编辑较新的版本。
小麦巫师

Answers:


8

Python 2,长度14 12 10 9

M=max;X=exit;i=input();L=[0]*M(i)
for	a	in	i:L[a-1]=M(L[:a])+1
X(M(L))

通过退出代码输出。

在线尝试!

怎么运行的

在任何时候,数组L跟踪到目前为止遇到的最长的排序子数组;L[a1]是最长的以a结尾的长度。

最初,我们没有处理数组元素,因此L完全由零组成。

在处理数组元素一种,我们首先取[L[0],,L[a1]]的最大值,它是迄今为止遇到的最长排序子数组的长度,以a或更小整数结尾。将a附加到这样的数组将使它保持排序,因此以a结尾的最长排序子数组比最大数组长一个元素。我们用计算值更新L[a1]

最终结果是大号的最大值。


您能否解释一下,为什么有效?我很难理解它:(
死负鼠

我添加了一个解释。
丹尼斯


5

果冻,长 4  2

ṢƑƇZLƲ}ŒP

在线尝试!

果冻代码页中的字节

183 146 144 90 76 169 125 19 80

怎么运行的

ṢƑƇZLƲ}ŒP  Main link. Argument: A (array)

       ŒP  Powerset; yield P, the array of all sub-arrays of A.
     Ʋ     Vier; combine the preceding four links into a monadic chain...
      }    and apply the chain to the right argument (P).
  Ƈ            Comb; only keep arrays for which the link to the left returns 1.
ṢƑ             Sort fixed; yield 1 if sorting doesn't alter the array.
   Z           Zip; read the filtered powerset by columns.
    L          Take the length.



3

Pyth,得分3 2(7个字节)

leSI#y

感谢Anders Kaseorg节省了一点。
在这里尝试

说明

leSI#y
     yQ    Take the power set of the (implicit) input (preserving order).
  SI#      Get the ones that are sorted.
 e         Take the last (longest).
l          Get the length.

leSI#y2.得分
安德斯Kaseorg

2

Stax,4个最大长度斯大林排序

S{:^fF%|M

运行并调试

它是这样的。

S       powerset of input
{:^f    filter by non-descending sequences
F%|M    take the maximum length remaining

2

[R ,得分15 11,72 62个字节

function(L,M=max,A=1:M(L)*0){for(Y in L)A[Y]=M(A[1:Y])+1;M(A)}

在线尝试!

Ports Dennis对R 的Python答案


仅仅更改变量名将无济于事,因为正如您的最后一个链接所示,在(得分)为15的子字符串中均未使用变量。
ØrjanJohansen

@ØrjanJohansen啊,当然,我很傻。我认为另一种方法是必要的。
朱塞佩

2

Brachylog,长度2(4个字节)

⊇≤₁l

在线尝试!

由于没有那么短的排序,所以答案很简洁。

08 03 80 6C在Brachylog的代码页中)

        Output
   l    the length of
 ≤₁     a non-decreasing
⊇       sublist of
        the input.
        (maximizing the size of the sublist)

我想出了►LSnmOṖHusk,但它的得分(至少是其长度)太糟糕了,无法打扰……
不相关的字符串
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.