増加するサブシーケンスへの分割


16

仕様

この課題は簡単に説明できます。入力は負でない整数の空ではない配列であり、タスクはできるだけ少ないサブシーケンスに分割することです。より正式にはA、入力配列がの場合、出力は次のBような配列の配列になります。

  • の各配列はBA互いに素な(必ずしも連続していない)サブシーケンスへのパーティションを形成します。帰納的に、これはをB含むシングルトン配列Aであるか、の最初の要素BがのサブシーケンスでAあり、残りAがそのサブシーケンスが削除されたパーティションを形成することを意味します。
  • のすべての配列Bは(必ずしも厳密ではありませんが)増加しています。
  • 配列の数Bは最小限です。

入力と出力の両方を、言語のネイティブ配列形式で取得できます。いくつかの正しい出力がある場合があることに注意してください。

入力配列を考えますA = [1,2,1,2,5,4,7,1]。可能な出力の1つですB = [[1],[1,2,4,7],[1,2,5]]。パーティションの状態は、次の図から明らかです。

A    1 2 1 2 5 4 7 1
B[0]               1
B[1] 1 2       4 7
B[2]     1 2 5

また、の各配列Bは増加しています。最後に、A増加する2つのサブシーケンスに分割できないため、の長さBも最小になります。したがって、それは有効な出力です。

ルールとスコアリング

関数または完全なプログラムを作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。期限はありませんが、提出する前にすべてのテストケースでソリューションを評価する必要があります。

テストケース

表示される出力は1つだけですが、有効なオプションがいくつかある場合があります。特に、結果の配列の順序は重要ではありません(ただし、個々の配列は昇順である必要があります)。

[0] -> [[0]]
[3,5,8] -> [[3,5,8]]
[2,2,2,2] -> [[2,2,2,2]]
[1154,1012,976,845] -> [[845],[976],[1012],[1154]]
[6,32,1,2,34,8] -> [[1,2,8],[6,32,34]]
[1,12,1,12,1,13] -> [[1,1,1,13],[12,12]]
[6,4,6,13,18,0,3] -> [[0,3],[4,6,13,18],[6]]
[1,2,3,2,3,4,7,1] -> [[1,1],[2,2,3,4,7],[3]]
[0,9,2,7,4,5,6,3,8] -> [[0,2,3,8],[4,5,6],[7],[9]]
[7,1,17,15,17,2,15,1,6] -> [[1,1,6],[2,15],[7,15,17],[17]]
[4,12,2,10,15,2,2,19,16,12] -> [[2,2,2,12],[4,10,15,16],[12,19]]
[10,13,9,2,11,1,10,17,19,1] -> [[1,1],[2,10,17,19],[9,11],[10,13]]
[3,7,3,8,14,16,19,15,16,2] -> [[2],[3,3,8,14,15,16],[7,16,19]]
[15,5,13,13,15,9,4,2,2,17] -> [[2,2,17],[4],[5,9],[13,13,15],[15]]

3
ルールは次のような解決策を許可しているようです[0,5,2,0] -> [[0,5],[0,2]](つまり、最初にゼロをリサイクルするのではなく、最初のゼロをリサイクルするなど)。それは意図的ですか?
feersum

@feersumそれは意図的なものではなく、良いキャッチでした。の条件を書き直しましたB。願わくば、もっと明確になりました。
ズガルブ

回答:


3

Haskell、54バイト

n#[]=[[n]]
n#(l:c)|[n]<=l=(n:l):c|1<2=l:n#c
foldr(#)[]

使用例:foldr(#)[] [4,12,2,10,15,2,2,19,16,12]->[[2,2,2,12],[4,10,15,16],[12,19]]

仕組み:入力リストを右端から順に見ていきます。現在の要素を付加することにより(リストの)出力リストを構築するn最初のサブリストに小さいかの頭部に等しいです。存在しない場合は、出力リストの最後に新しいシングルトンリストを作成します。lnln


1

Pyth、20バイト

fTu&ahfSI+THGHGQm[)Q

オンラインで試す:デモンストレーションまたはテストスイート

貪欲なアプローチ。len(input)空のリストを作成します。次にinput、最初のリストを選択して、番号の各番号を繰り返し処理します。このリストは、番号を追加した後もソートされています。

説明:

fTu&ahfSI+THGHGQm[)Q   implicit: Q = input list
                m[)Q   create a list of empty lists and assign to G
  u            Q       iterate over all numbers H in input:
      f     G             filter for lists T in G, which satisfy:
         +TH                 create a new list out of T and H
       SI                    and check if it is sorted
     h                    take the first such list T
    a        H            and append H
   &          G           logical and with G (so that u doesn't overwrite G)
fT                     remove all empty lists

@ThomasKwa現在、非常に多くの追加のテストケースをテストしました。間違った結果をもたらす単一のものを見つけることができませんでした。Greedyは常に正しい結果を返すと確信しています。
ジャクベ

@ThomasKwaああ、その反例は、異なる貪欲な戦略に対するものでした(最も長く増加するサブシーケンスを見つけ、それを削除して再帰します)。また、私は...この提出が失敗したため、テストケースを見つけることができないよう
Zgarb

まあ、私は、それが機能することを証明するために、回答者に負担があると思います。これが有効であることが証明されたら、賛成します。
リトシアスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.