Blokuj sortowanie losowe
Blok losowe sortowania jest (raczej sztuczny) sposób sortowania listy. Działa w następujący sposób, ilustrowany przykładem.
[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]
Podział na ciągłe bloki można wybrać dowolnie. Jednak nie wszystkie wybory bloków dają posortowaną listę na końcu:
[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]
Jeśli wszystkie bloki mają długość 1 lub jeśli jest tylko jeden blok, wynik zostanie oczywiście posortowany. Ale są to raczej skrajne przypadki. W tym wyzwaniu Twoim zadaniem jest znalezienie równowagi między liczbą bloków a maksymalną długością bloku.
Zadanie
Twój wkład jest niepustą listą liczb całkowitych L , wykonaną w dowolnym rozsądnym formacie. Jego wynik jest najmniejszą liczbę całkowitą N , tak że L może być bloku losowego posortowane tak, że liczba bloków i długość poszczególnych bloków w większości N .
Najniższa liczba bajtów w każdym języku wygrywa. Obowiązują standardowe zasady gry w golfa .
Przypadki testowe
[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 bajtów
Wypróbuj online!
Wyjaśnienie
To jest odpowiedź na pytanie; Zaprojektowałem to wyzwanie z myślą o Brachylog i znalazłem
~c₎{…}ᵈ
interesującą konstrukcję.Wbudowana
c
konkatenuje listę list. Jeśli ma indeks dolnyN
, wymagana jest liczba listN
. Symbol₎
modyfikuje wbudowane, aby pobierać parę jako dane wejściowe i używać prawego elementu jako indeksu dolnego. Zatemc₎
trwa parę[L,N]
wymaga, aby liczba wykazów wL
toN
, i zwraca konkatenacjiL
. Podczas działania w odwrotnej kolejności~c₎
pobiera listęL
i zwraca parę[P,N]
, gdzieP
jest podziałL
naN
bloki. Są one wyliczane w porządku rosnącymN
.Metapredykat
ᵈ
przekształca zwykły predykat w taki, który sprawdza relację między dwoma elementami pary. Mówiąc ściślej,{…}ᵈ
bierze parę[A,B]
, sprawdza, któreA{…}B
trzyma i generujeB
. Używam go do sprawdzenia, czyP
można go posortować według bloków i czy zawiera on tylko listy długościN
.Uwaga:
P
może zawierać puste listy. Zapewnia to poprawność również w tych przypadkach, w których maksymalna długość bloku jest większa niż liczba bloków.źródło
Python 2 ,
186146 bajtówWypróbuj online!
Druga funkcja pochodzi z tej wskazówki przez feersum .
źródło
Rubin , 158 bajtów
Wypróbuj online!
źródło
Pyth ,
24 2320 bajtówZestaw testowy.
Jak to działa
źródło
APL (Dyalog Classic) ,
7167 bajtów⎕IO
musi być0
Wypróbuj online!
W jaki sposób?
⌊/
- Znajdź minimum ...(⌈/≢,≢¨)
- ... maksymalna długość i liczba elementów ...¨
- ... każdego elementu ...T/⍨
- ... elementy, które ...{S[⍋S]≡∊⍵[⍋↑⍵]}¨
- ... są sortowane po spłaszczeniu, z ...T←{⍵[⍋⍵]}¨¨
- ... posortowane elementy elementów ...⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵
- ... partycje argumentu (wraz z niektórymi śmieciami)źródło