Tri par ordre aléatoire
Le tri aléatoire par blocs est une méthode (plutôt artificielle) de tri d'une liste. Il fonctionne comme suit, illustré par un exemple.
[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]
La partition en blocs contigus peut être choisie arbitrairement. Cependant, tous les choix de blocs ne produiront pas une liste triée à la fin:
[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]
Si tous les blocs ont une longueur 1, ou s'il n'y a qu'un seul bloc, le résultat sera bien sûr trié. Mais ce sont des cas assez extrêmes. Dans ce défi, votre tâche consiste à trouver un équilibre entre le nombre de blocs et la longueur maximale d'un bloc.
La tâche
Votre entrée est une liste non vide d'entiers L , prise dans n'importe quel format raisonnable. Votre sortie est le plus petit entier N tel que L peut être aléatoire bloc triée de sorte que le nombre de blocs et la longueur de chaque bloc sont au plus N .
Le nombre d'octets le plus bas dans chaque langue gagne. Les règles de code-golf standard s'appliquent.
Cas de test
[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 octets
Essayez-le en ligne!
Explication
C'est une auto-réponse; J'ai conçu ce défi en pensant à Brachylog et j'ai trouvé
~c₎{…}ᵈ
une construction intéressante.Le intégré
c
concatène une liste de listes. Si on lui donne un indiceN
, il faut que le nombre de listes soitN
. Le symbole₎
modifie un intégré pour prendre une paire en entrée et utiliser son élément droit comme indice. Prend doncc₎
une paire[L,N]
, nécessite que le nombre de listes dansL
soitN
, et retourne la concaténation deL
. Lorsqu'il est exécuté en sens inverse,~c₎
prend une listeL
et renvoie une paire[P,N]
, où seP
trouve une partition deL
enN
blocs. Ils sont énumérés par ordre croissant deN
.Le métaprédicat
ᵈ
transforme un prédicat ordinaire en un prédicat qui vérifie une relation entre les deux éléments d'une paire. Plus explicitement,{…}ᵈ
prend une paire[A,B]
, vérifie que c'est le casA{…}B
et sortB
. Je l'utilise pour vérifier qu'ilP
peut être trié par blocs et ne contient que des listes de longueur au maximumN
.Notez que
P
peut contenir des listes vides. Cela garantit l'exactitude également dans les cas où la longueur maximale d'un bloc est supérieure au nombre de blocs.la source
Python 2 ,
186146 octetsEssayez-le en ligne!
La deuxième fonction est extraite de cette astuce par feersum .
la source
Rubis , 158 octets
Essayez-le en ligne!
la source
Pyth ,
24 2320 octetsSuite de tests.
Comment ça fonctionne
la source
APL (Dyalog Classic) ,
7167 octets⎕IO
doit être0
Essayez-le en ligne!
Comment?
⌊/
- Trouvez le minimum de ...(⌈/≢,≢¨)
- ... le maximum de la longueur et du nombre d'éléments ...¨
- ... de chaque élément de ...T/⍨
- ... les éléments qui ...{S[⍋S]≡∊⍵[⍋↑⍵]}¨
- ... sont triés à plat, de ...T←{⍵[⍋⍵]}¨¨
- ... les éléments triés des éléments de ...⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵
- ... les partitions de l'argument (avec quelques ordures)la source