交叉序列


11

交叉序列

给定一个正整数列表,如果每个元素大于或等于前一个A,则称其为递增序列;否则,将其称为递增序列。如果每个元素小于或等于前一个元素,则将其称为递减序列

一些增加的顺序:

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

一些递减顺序:

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

交叉序列是可以分解成两个不相交的子序列,一个增加的序列和其他的递减序列的列表。

例如,列表:

[3,5,2,4,1]

是交叉序列,因为它可以分解为:

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

哪里[3,4]是增加的子序列,[5,2,1]是减少的子序列。我们将这样的一对(递增,递减)子序列称为交叉序列的分解

名单:

[4,5,2,1,3]

不是交叉序列;没有办法将其分解为增加和减少的子序列。

您的任务是编写一个程序/函数,将正整数列表作为输入;如果是交叉序列,则以其分解之一返回两个列表;或一些一致的“假”值(如果列表不是交叉序列)。

这是;每种语言中最短的程序/功能就是赢家。

规则:

  • 输入是灵活的。
  • 通常的漏洞是被禁止的。
  • 如果有多种分解输入的有效方法,则可以输出其中一种或全部。
  • 分解的输出格式很灵活;但是在两个子序列之间的区别上必须是明确的。
  • 您可以使用任何一致的输出值来表示输入不是交叉序列。只要与任何交叉序列的输出相比,它都是明确的。您应该在答案中指定falsey值。

测试用例:

使用False,以指示不交叉的序列:

[3, 5, 2, 4, 1] => [3, 4], [5, 2, 1]
[3, 5, 2, 4, 4, 1, 1] => [3, 4, 4], [5, 2, 1, 1]

[7, 9, 8, 8, 6, 11] => [7, 8, 8, 11], [9, 6]
[7, 9, 8, 8, 6, 11] => [7, 9, 11], [8, 8, 6] # also valid
[7, 9, 8, 8, 6, 11] => [7, 8, 11], [9, 8, 6] # also valid

[7, 8, 9, 10, 20, 30] => [7, 8, 9, 20, 30], [10]
[7, 8, 9, 10, 20, 30] => [8, 9, 10, 20, 30], [7] # this is also valid

[5, 5, 5] => [5, 5, 5], []

[4, 5, 2, 1, 3] => False
[3, 4, 3, 4, 5, 2, 4] => False

2
可能重复。我看到的只有两个区别是,另一个挑战应该在输入长度的多项式时间内运行,并允许使用真实值而不是两个子序列(返回子序列本身将获得20%的奖励)。听起来对我来说还是个骗子,但我不会锤子。
凯文·克鲁伊森

@KevinCruijssen的时间限制本身就足以使它不被欺骗。
肯尼迪

1
@NickKennedy可能是的,这就是为什么我不愿意锤打它。:)
凯文·克鲁伊森

2
建议的测试用例:[3, 5, 2, 4, 4, 1, 1]。当前的测试用例使您可以放心使用>=/ <,而实际上应该是>=/ <=
Grimmy

1
@Arnauld:是的,它可以是任何值(“ false”只是说:输入是交叉序列是错误的)。
查斯·布朗

Answers:


1

05AB1E15 14 13字节

2.Œ.ΔćRšεü@}W

在线尝试验证所有测试用例

说明:

2.Œ                    # all partitions of the input in 2 subsequences
   .Δ                  # find the first partition such that the following gives 1
     ćRš               # reverse the first subsequence
        ε  }           # map each subsequence to
         ü@            # pairwise greater-than
            W          # minimum (1 if all 1s, 0 otherwise)


1

的JavaScript(ES6), 110个105  104字节

[[decreasing], [increasing]]1个

f=(a,n,b=[[],[]])=>a.some((v,i)=>[...x=b[i=n>>i&1]].pop()*(x.push(v),i-=!i)>v*i)?n>>a.length||f(a,-~n):b

在线尝试!

怎么样?

ñ02大号大号

b[0]b[1个]一世ñ

1个一世=1个-1个一世=0

[...x = b[i = n >> i & 1]].pop() * (x.push(v), i -= !i) > v * i

bsome()


1

Haskell,84个字节

(([],[])#)
(d,i)#(a:b)=(#b)=<<[(d++[a],i)|all(a<=)d]++[(d,i++[a])|all(a>=)i]
p#_=[p]

返回所有有效(decreasing,increasing)对的列表,如果没有这样的对,则返回空列表。

在线尝试!


1

Python 3中109个 107字节

def f(l,i=[],d=[]):
 if l:s,*r=l;i and s<i[-1]or f(r,i+[s],d);d and s>d[-1]or f(r,i,d+[s])
 else:print(i,d)

在线尝试!

该功能将所有可能的分解结果打印到标准输出中。如果没有可能的分解,则不会打印任何内容。

感谢@Sriotchilism O'Zaic提出的改进建议。


欢迎来到该网站。我建议使用s<i[-1]而不是i[-1]>s 和相似d[-1]<s ,都节省一个字节。
Ad Hoc Garf Hunter

谢谢你的建议。我已经更新了答案。这里是否有可复制粘贴的模板用于发布答案?
乔尔,

我不确定你是什么意思?TIO有一个您似乎已经在使用的模板。
Ad Hoc Garf Hunter

我只在TIO上生成了一个链接,并将该链接添加到我的帖子中。我在那里没有使用任何模板。它在哪里?
乔尔,

1
@Joel-在TIO页面的顶部,有一个看起来像一些链链接的图标。单击该,然后您会看到一个选项页面。其中之一是“代码高尔夫提交”。这会将所需的格式化内容放入复制缓冲区!也欢迎您,很好的解决方案!
查斯·布朗


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.