Shuffle-Sortierung blockieren
Die Block-Shuffle-Sortierung ist eine (eher künstliche) Methode zum Sortieren einer Liste. Es funktioniert wie folgt, anhand eines Beispiels.
[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]
Die Aufteilung in zusammenhängende Blöcke kann beliebig gewählt werden. Nicht alle Auswahlmöglichkeiten von Blöcken führen jedoch am Ende zu einer sortierten Liste:
[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]
Wenn alle Blöcke die Länge 1 haben oder wenn es nur einen Block gibt, wird das Ergebnis natürlich sortiert. Dies sind aber eher Extremfälle. In dieser Herausforderung besteht Ihre Aufgabe darin, ein Gleichgewicht zwischen der Anzahl der Blöcke und der maximalen Länge eines Blocks zu finden.
Die Aufgabe
Ihre Eingabe ist eine nicht leere Liste von Ganzzahlen L , die in einem beliebigen vernünftigen Format eingegeben werden. Ihre Ausgabe soll die kleinste Ganzzahl N sein, so dass L blockweise sortiert werden kann, so dass die Anzahl der Blöcke und die Länge jedes Blocks höchstens N beträgt .
Die niedrigste Byteanzahl in jeder Sprache gewinnt. Es gelten die Standardregeln für Code-Golf .
Testfälle
[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
Brachylog , 17 Bytes
Probieren Sie es online!
Erläuterung
Dies ist eine Selbstantwort; Ich habe diese Herausforderung mit Blick auf Brachylog entworfen und
~c₎{…}ᵈ
ein interessantes Konstrukt gefunden.Das eingebaute
c
verkettet eine Liste von Listen. Wenn ein Index angegeben wirdN
, muss die Anzahl der Listen angegeben werdenN
. Das Symbol₎
ändert ein eingebautes Element, um ein Paar als Eingabe zu verwenden und sein rechtes Element als Index zu verwenden. Somitc₎
nimmt ein Paar[L,N]
erfordert, dass die Anzahl der ListenL
istN
, und gibt die VerkettungL
. Bei umgekehrter Ausführung~c₎
wird eine Liste erstelltL
und ein Paar zurückgegeben[P,N]
, bei demP
es sich um eine AufteilungL
inN
Blöcke handelt. Sie werden in aufsteigender Reihenfolge von aufgelistetN
.Das Metapredikat
ᵈ
wandelt ein gewöhnliches Prädikat in ein Prädikat um, das eine Beziehung zwischen den beiden Elementen eines Paares überprüft. Nimmt genauer{…}ᵈ
gesagt ein Paar[A,B]
, prüft dasA{…}B
und gibt es ausB
. Ich benutze es, um zu überprüfen, obP
es blockweise sortiert werden kann und nur Listen mit maximaler Länge enthältN
.Beachten Sie, dass
P
möglicherweise leere Listen enthalten sind. Dies stellt die Korrektheit auch in den Fällen sicher, in denen die maximale Länge eines Blocks größer als die Anzahl der Blöcke ist.quelle
Python 2 ,
186146 BytesProbieren Sie es online!
Die zweite Funktion wird von feersum von diesem Tipp übernommen .
quelle
Ruby , 158 Bytes
Probieren Sie es online!
quelle
Pyth ,
24 2320 BytesTestsuite.
Wie es funktioniert
quelle
APL (Dyalog Classic) ,
7167 Bytes⎕IO
muss sein0
Probieren Sie es online!
Wie?
⌊/
- Finden Sie das Minimum von ...(⌈/≢,≢¨)
- ... das Maximum der Länge und Anzahl der Elemente ...¨
- ... von jedem Element von ...T/⍨
- ... die Elemente, die ...{S[⍋S]≡∊⍵[⍋↑⍵]}¨
- ... werden abgeflacht sortiert, von ...T←{⍵[⍋⍵]}¨¨
- ... die sortierten Elemente der Elemente von ...⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵
- ... die Partitionen des Arguments (zusammen mit etwas Müll)quelle