アドベントチャレンジ6:トランスポートドックのラベル変更


9

<<前 へ次へ>>

PPCGコミュニティのおかげで、サンタはプレゼントを運送ドックに移動するための正しい順序に整理することができました。残念ながら、運送用ドックの看板は壊れているので、プレゼントをどこに置くかわからないのです!プレゼントはすべて一緒にグループ化されており、その範囲ではなく、サンタがより良いアイデアだったと認めています。

次に、ソートされた順序でプレゼントが与えられた場合、現在が正しい順序になるようなすべての可能な最小範囲構成を決定します。つまり、チャレンジ#5のアルゴリズムに従ってプレゼントを並べ替えても順序が変わらないように、すべての最小範囲構成を見つけます。

チャレンジ

最小範囲構成は、範囲がそれぞれ可能な限り小さい範囲のリストです。つまり、プレゼントの特定のサブセットをカバーするように範囲が指定されている場合、範囲の最小値と最大値はサブセットの最小値と最大値と同じでなければなりません。つまり、カバーの範囲を縮小すると、カバーではなくなります。

課題は、現在のサイズに適用できるすべての可能な最小範囲構成を見つけることです。例を見てみましょう:[3, 1, 2, 5, 4, 7, 6]

現在の構成全体の範囲をとることは、些細な場合です。この場合、[[1, 7]]解決策になります。

一意の要素を持つ例の場合、別の些細なケースになります[[3], [1], [2], [5], [4], [7], [6]](範囲を順序付ける必要がないため)。

この例では、我々はまた、それを見る[[1, 3], [4, 7]][[1, 3], [4, 5], [6, 7]]同様に、働くだろう[[1, 3], [5], [4], [6, 7]][[1, 3], [4, 5], [7], [6]]

の最終的な答えは[3, 1, 2, 5, 4, 7, 6]でしょう[[[3], [1], [2], [5], [4], [7], [6]], [[3], [1], [2], [5], [4], [6, 7]], [[3], [1], [2], [4, 5], [7], [6]], [[3], [1], [2], [4, 5], [6, 7]], [[3], [1], [2], [4, 7]], [[3], [1, 2], [5], [4], [7], [6]], [[3], [1, 2], [5], [4], [6, 7]], [[3], [1, 2], [4, 5], [7], [6]], [[3], [1, 2], [4, 5], [6, 7]], [[3], [1, 2], [4, 7]], [[1, 3], [5], [4], [7], [6]], [[1, 3], [5], [4], [6, 7]], [[1, 3], [4, 5], [7], [6]], [[1, 3], [4, 5], [6, 7]], [[1, 3], [4, 7]], [[1, 5], [7], [6]], [[1, 5], [6, 7]], [[1, 7]]]

フォーマット仕様

入力は、言語の適切なサポートされている数値範囲内の任意の適切な形式の正の整数のフラットリストとして提供されます。入力に重複した要素が含まれている可能性があります。出力は、適切な形式の正の整数の3Dリストとして提供する必要があります。

(第2層である)あなたの出力の各範囲は、としてのいずれかで表すことができ[min, max][num]それは単一値の範囲です、または全範囲自体が、あなたの出力形式として一貫していなければならない場合。少し異なる合理的な出力形式を使用するかどうかを指定してください。

重複する値は、出力の単一の範囲でカバーされる必要があります。つまり、出力の2つの範囲がオーバーラップすることはありません。

ソリューションは範囲を任意の順序で返す可能性があり、これは確定的である必要はありません。

ルール

  • 標準抜け穴が適用されます
  • これはので、バイト単位の最も短い答えが勝ちます
  • 回答は受け付けられません

重複する要素を含むリストのテストケース:

2 3 2 4 -> [[[2, 3], [4]], [[2, 4]]]

リファレンス実装

ヘッダーはリンクです。

注:このチャレンジシリーズは、Advent Of Codeからインスピレーションを得ました。このサイトとは関係ありません

こちらの最初のチャレンジの「リンクされた」セクションを見ると、シリーズのすべてのチャレンジのリストを確認できます

幸せなゴルフ!

回答:



3

Brachylog17 16バイト

{~c⟨⌋⟦₂⌉⟩ᵐ.c≠∧}ᶠ

重複のあるリストでも機能します。範囲は、含まれる要素のリストによって表されます。 オンラインでお試しください!

説明

アイデアは、リストをブロックに分割し、ブロックを範囲に変換してから、それらが重複しないことを確認することです。

{~c⟨⌋⟦₂⌉⟩ᵐ.c≠∧}ᶠ  Input is a list.
{             }ᶠ  Compute all possible outputs for this predicate:
 ~c                Break the list into contiguous blocks.
   ⟨    ⟩ᵐ         For each block,
    ⌋  ⌉           take its minimum and maximum,
     ⟦₂            and create the range between them.
          .        This is the output.
           c       Also, if you concatenate the output,
            ≠      its elements are distinct.
             ∧     Prevent the interpreter from thinking this is also the output.

1

JavaScript(ES6)、166 164バイト

編集:重複をサポートするようになった更新バージョン

結果を[min、max]形式でコンソールに直接出力します。

f=(a,r=[],l=0)=>a[l++]?f([...a],r,l,f(a,[...r,[Math.min(...x=a.splice(0,l)),Math.max(...x)]])):a[0]|r.some(([x,y],i)=>r.some(([z])=>i--&&z>=x&z<=y))||console.log(r)

テストケース


0

Python 2、179バイト

lambda l:[l for l in[[range(min(x),max(x)+1)for x in P]for P in p(l)]if len(sum(l,[]))==len(set(sum(l,[])))]
p=lambda l:[[l[:i]]+a for i in range(1,len(l))for a in p(l[i:])]+[[l]]

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

全範囲のリストを出力します。

リファレンス実装に強く影響を受けています。

すべてのパーティションを作成し、次に各パーティションの最小/最大の範囲を作成します。範囲のリストは、値がリストに2回以上出現しない場合に有効です。


sum(l,[]) リストのリストをフラット化し、重複をチェックできるようにします。

l=[[1, 2], [2, 3]]
sum(l,[]) = [1,2,2,3]
len([1,2,2,3] == len(set([1,2,2,3]))  -> False (duplicates)

0

Pyth、17バイト

f{IsTmm}hSkeSkd./

ここでお試しください!

今ではそれはずっと良いです。全範囲を出力します。以前のバージョンの改訂履歴を参照してください(驚異的な31バイト)。

使い方

f {IsTmm} hSkeSkd./〜>完全なプログラム。

               ./〜>リストパーティション。
     m〜>変数を使用してマップd。
      md〜>変数kを使用してdにマップします。
        hSk〜> kの最小値。
           eSk〜> kの最大値。
       }〜>包含的な整数の範囲。
f〜>それらをフィルタリング...
   sT〜>平坦化すると、
 {I〜>重複排除では不変です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.