シャッフルブロックで並べ替え


18

ブロックシャッフルソート

ブロックは、ソートシャッフルリストをソートする(むしろ人工的な)方法です。例で示すように、次のように機能します。

[6, 1, 0, 3, 2, 4, -2, -1]
                            Break list into contiguous blocks
[6][1, 0][3, 2, 4][-2, -1]
                            Sort each block
[6][0, 1][2, 3, 4][-2, -1]
                            Sort blocks lexicographically
[-2, -1][0, 1][2, 3, 4][6]
                            Concatenate
[-2, -1, 0, 1, 2, 3, 4, 6]

連続ブロックへのパーティションは、任意に選択できます。ただし、ブロックのすべての選択が最後にソートされたリストを生成するわけではありません。

[6, 1, 0, 3, 2, 4, -2, -1]
[6, 1, 0][3, 2, 4][-2, -1]
[0, 1, 6][2, 3, 4][-2, -1]
[-2, -1][0, 1, 6][2, 3, 4]
[-2, -1, 0, 1, 6, 2, 3, 4]

すべてのブロックの長さが1の場合、またはブロックが1つしかない場合、結果はもちろんソートされます。しかし、これらはかなり極端な場合です。この課題でのタスクは、ブロック数とブロックの最大長のバランスを見つけることです。

タスク

入力は整数Lの空ではないリストであり、適切な形式で取得されます。出力は、ブロックの数と各ブロックの長さが最大でNになるようにLをブロックシャッフルソートできる最小の整数Nでなければなりません。

各言語の最低バイト数が優先されます。標準の規則が適用されます。

テストケース

[5] -> 1
[1,2] -> 2
[0,2,1,-1] -> 3
[-1,0,2,1] -> 2
[9,3,8,2,7] -> 4
[9,2,8,3,7] -> 3
[5,9,3,7,2,4,8] -> 7
[-1,-2,1,2,-1,-2,7] -> 4
[6,1,0,3,2,4,-2,-1] -> 4
[12,5,6,-6,-1,0,2,3] -> 3
[1,0,1,0,1,0,1,0,1,0] -> 6
[1,2,1,3,1,2,3,2,4,3] -> 5
[7,7,7,7,8,9,7,7,7,7] -> 4

回答:


5

Brachylog23 22 20 19バイト

Zgarb、H.PWiz、およびFatalizeのおかげで、ある程度のバイト数を節約できました。

~cᶠ{oᵐoc≤₁&≡ᵃlᵐ⌉}ˢ⌋

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

ここにはゴルフがあるはずです...

説明

~cᶠ      Find all lists that concatenate into the input, i.e. all partitions
         of the input.
{        Discard all partitions for which this predicate fails, and replace
         the rest with the output of this predicate.
  oᵐ       Sort each sublist of the partition.
  o        Sort the entire list.
  c≤₁      And require concatenation of the result to be sorted.
  &        Then:
  ≡ᵃ       Append the partition to itself.
  lᵐ       Map "length" over this list, i.e. we get the length of each block, as
           well as the length of the partition itself.
  ⌉        Take the maximum.
}ˢ
⌋        Take the minimum of all those maxima.

3

ゼリー、17バイト

Ṣ€ṢF
ŒṖÇÐṂ+Z$€L€Ṃ

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

代替バージョン、15バイト、ポストデートチャレンジ

最新バージョンでƊは、3つのリンクを1つのチェーンに結合します。これにより、次のゴルフが可能になります。

ŒṖṢ€ṢFƊÐṂ+ZLƊ€Ṃ

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

使い方

Ṣ€ṢF          Helper link. Argument: P (partitioned array)

Ṣ€            Sort each chunk.
  Ṣ           Sort the sorted chunks.
   F          Flatten.


ŒṖÇÐṂ+Z$€L€Ṃ  Main link. Argument: A (array)

ŒṖ            Generate all partitions of A.
  ÇÐṂ         Keep those for which the helper link returns the minimal array, i.e.,
              those that return sorted(A).
     +Z$€     Add each partition to its transpose.
              Due to how Jelly vectorizes, the length of the sum is the maximum of
              the length of the operands, and the length of the transpose is the
              length of the array's largest column.
         L€   Take the length of each sum.
           Ṃ  Take the minimum.

2

スタックス28 26 25 24 23 バイトCP437

é%(>ù│ê²☻û◙T╠►╜◘íaæAtI╥

オンラインで実行してデバッグします!

3バイトの節約に対する@recursiveへのクレジット。

Staxはここでは少し冗長です。デフォルトで配列をソートするには2バイト、配列の最大/最小を取得するには2バイト、配列を平坦化するには2バイトかかります。とにかく、私はまだ解決策投稿しており、それを改善する方法について有用な提案があることを願っています

説明

解凍されたバージョンを使用して説明します。

%cFxs|!F{{omo:f:^!C_Mch\%|m
%cFxs|!F                        Do for all partitions, grouped by number of sub-arrays
                                    Grouping by number of sub-arrays in this problem does not help but it's the default                    
        {{om{o                  Sort inside block then sort blocks lexicographically
              :f:^              The result when flattened is sorted
                  !C            Skip the rest of the loop if the last line is false
                    _|<         Take the current partition, pad to the longest

                       h        Take the first element, whose length is now the maximum of all sub-arrays in the original partition
                        \       Zip with the current partition, the shorter one is repeated
                         %      Number of elements
                                Which is the maximum of all sub-array sizes and the number of sub-arrays in the current partition  
                          |m    Take the minimum among all choices of partitions

これにより、25が得られます
再帰的

1
これは、staxにとっては期待はずれのパフォーマンスですが、節約を探し続けます。
再帰的


それはただ...驚くべきことです。
ウェイジュン周

ありがとう。「https://」を「http://」に置き換えた後、ハイパーリンクがコメントの最大サイズを正確に使用しているのは面白いと思いました。
再帰的

2

Brachylog、17バイト

~c₎{oᵐoc≤₁&lᵐ⌉≤}ᵈ

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

説明

これは自己回答です。Brachylogを念頭に置いてこの課題を設計し~c₎{…}ᵈ、興味深い構造を見つけました。

ビルトインcはリストのリストを連結します。下付き文字が与えられている場合N、リストの数はである必要がありますN。シンボルは組み込みを変更して、ペアを入力として受け取り、その正しい要素を添え字として使用します。従ってc₎ペアをとり[L,N]、内リストの数は、その必要LであるN、との連結を返しますL。逆に実行すると~c₎、リストLを取得し、ペアを返します。[P,N]ここでPは、ブロックLへのパーティションですN。それらは、昇順で列挙されますNます。

メタ述語は、通常の述語を、ペアの2つの要素間の関係をチェックする述語に変換します。より明示的に{…}ᵈ、ペアを取り、保持する[A,B]チェックをA{…}B行い、出力しますB。これを使用して、Pブロックでソートでき、長さのリストのみが含まれていることを確認しますN

~c₎{oᵐoc≤₁&lᵐ⌉≤}ᵈ  Input is a list, say L = [9,2,8,3,7].
~c₎                Guess the pair [P,N]: [[[9],[2],[8,3,7]],3]
   {           }ᵈ  Verify this predicate on P and N and return N:
    oᵐ              Sort each list in P: [[9],[2],[3,7,8]]
      o             Sort lexicographically: [[2],[3,7,8],[9]]
       c            Concatenate: [2,3,7,8,9]
        ≤₁          This list is nondecreasing: true.
          &lᵐ       Length of each list in P: [1,1,3]
             ⌉      Maximum: 3
              ≤     This is at most N: true.

P空のリストが含まれることがあることに注意してください。これにより、ブロックの最大長がブロック数よりも大きい場合にも正確性が確保されます。




1

Pyth 24 23  20バイト

hSmeSlMs]Bd.msSSMb./

テストスイート。

使い方

hSmeSlMs]Bd.msSSMb./ – Full program. Hereby, Q represents the input.
                  ./ – All possible partitions of Q.
           .m        – Take the partitions which yield a minimal (i.e. sorted) list over:
             sSSMb   – Sorting function. Uses the variable b.
               SMb   – Sort each list in each partition b.
              S      – Sort the partition b.
             s       – And flatten (by 1 level).
  meSlMs]Bd          – Map. Uses a function whose variable is d.
        ]Bd          – Pair d with its wrapping in a singleton list. Returns [d, [d]].
       s             – Flatten (by 1 level). Returns [*d, d], where "*" is splatting.
     lM              – Take the length of each element.
   eS                – Retrieve the maximal length.
hS                   – Return the minimum element of the list of maximal lengths.

0

APL(Dyalog Classic)71 67バイト

{⌊/(⌈/≢,≢¨)¨T/⍨{S[⍋S]≡∊⍵[⍋↑⍵]}¨T←{⍵[⍋⍵]}¨¨⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵}

⎕IO でなければなりません 0

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

どうやって?

  • ⌊/- の最小値を見つける...
  • (⌈/≢,≢¨)- ...素子の長さと数の最大...
  • ¨- ...の各要素の...
  • T/⍨- ...その要素...
  • {S[⍋S]≡∊⍵[⍋↑⍵]}¨- ...平坦化する場合、並べ替えのしています...
  • T←{⍵[⍋⍵]}¨¨- ...の要素のソートされた要素...
  • ⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵- ...(いくつかのジャンクと一緒に)引数のパーティション
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.