交差シーケンス


11

交差シーケンス

正の整数のリストが与えられ、各要素が前の要素以上である場合A、それを増加シーケンスと呼びます。そして、各要素が前の要素以下の場合、それを減少シーケンスと呼びます。

いくつかの増加するシーケンス:

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

いくつかの減少するシーケンス:

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

交差配列は、 2つの互いに素サブ一つ増加配列および他のA減少シーケンスに分解することができるリストです。

たとえば、リスト:

[3,5,2,4,1]

次のように分解できるため、交差シーケンスです。

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

ここ[3,4]で、は増加するサブシーケンスで[5,2,1]あり、は減少するサブシーケンスです。このような(増加、減少)サブシーケンスのペアを交差シーケンスの分解と呼びます。

リスト:

[4,5,2,1,3]

交差シーケンスではありません。それを増加するサブシーケンスと減少するサブシーケンスに分解する方法はありません。

あなたの仕事は、正の整数のリストを入力として受け取るプログラム/関数を書くことです。交差シーケンスの場合は、分解の1つで2つのリストを返します。リストが交差シーケンスでない場合は、一貫性のある「誤った」値。

これはです。各言語で最も短いプログラム/機能が勝者です。

ルール:

  • 入力は柔軟です。
  • 通常の抜け穴は禁止されています。
  • 入力を分解する有効な方法が複数ある場合は、そのうちの1つまたはすべてを出力できます。
  • 分解の出力フォーマットは柔軟です。しかし、2つのサブシーケンスの違いに関しては明確でなければなりません。
  • 入力が交差シーケンスではないことを示すために、一貫した出力値を使用できます。交差シーケンスの出力と比較して明確である限り。答えには偽の値を指定する必要があります。

テストケース:

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
重複の可能性があります。唯一の2つの違いは、他のチャレンジは入力の長さの多項式時間で実行する必要があり、2つのサブシーケンスの代わりに真の値を許可することです(ただし、サブシーケンス自体を返すと20%のボーナスを受け取ります)。それでも私にはだまされたように聞こえますが、私はそれを叩きません。
Kevin Cruijssen、

@KevinCruijssenの時間制限は、おそらくそれだけでこれをだましにしないには十分です。
ニックケネディ

1
@NickKennedyたぶんそうだろう、それが私がそれを叩くことを控えた理由だ。:)
Kevin Cruijssen

2
推奨されるテストケース:[3, 5, 2, 4, 4, 1, 1]。現在のテストケースは、あなたが離れて取得してみましょう>=/ <、それは本当にあるべきとき>=/ <=
Grimmy

1
@Arnauld:はい、それは任意の値にすることができます( "falsey"は単に言うことです:入力が交差シーケンスであることはfalseです)。
Chas Brown

回答:




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

オンラインでお試しください!

どうやって?

n02LL

b[0]b[1]in

1i=11i=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の3109の 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 、両方のバイトを保存します。
アドホックガーフハンター、

提案をありがとう。答えを更新しました。回答を公開するためのコピー貼り付け可能なテンプレートはありますか?
ジョエル

どういう意味かわかりませんか?TIOには、すでに使用しているように見えるテンプレートがあります。
アドホックガーフハンター

TIOでのみリンクを生成し、そのリンクを投稿に追加しました。そこではテンプレートを使用しませんでした。それはどこにある?
ジョエル

1
@Joel-TIOページの上部に、いくつかのチェーンリンクのようなアイコンがあります。それをクリックすると、オプションのページが表示されます。その1つが「Code Golf Submission」です。それはあなたが望むフォーマットされたものをあなたのコピーバッファに入れます!ようこそ、そして素晴らしい解決策です!
Chas Brown

0

Brachylog、17バイト

;Ṣzpᵐz{ℕˢ}ᵐ≤₁ʰ≥₁ᵗ

オンラインでお試しください!

これをゴルフする余地はおそらくかなりあるでしょう。


2
あなたは既に前にこの課題に答えてきたここで、あなたは16バイトでそれをやったところ。;)
Kevin Cruijssen

私がやったのと同じようなことがあったという気持ちを揺さぶることはできませんでしたが、なぜか私の心は代わりにこれでなければならないと決めました
Unrelated String

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.