Ordina per mescolare i blocchi


18

Blocca l'ordinamento casuale

L' ordinamento a blocchi casuale è un metodo (piuttosto artificiale) per ordinare un elenco. Funziona come segue, illustrato da un esempio.

[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 partizione in blocchi contigui può essere scelta arbitrariamente. Tuttavia, non tutte le scelte di blocchi produrranno un elenco ordinato alla fine:

[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]

Se tutti i blocchi hanno lunghezza 1 o se esiste un solo blocco, il risultato verrà ovviamente ordinato. Ma questi sono casi piuttosto estremi. In questa sfida, il tuo compito è trovare un equilibrio tra il numero di blocchi e la lunghezza massima di un blocco.

L'obiettivo

Il tuo input è un elenco non vuoto di numeri interi L , preso in qualsiasi formato ragionevole. L'output è il più piccolo intero N tale che L può essere blocco casuale allineati in modo che il numero di blocchi e la lunghezza di ogni blocco sono al massimo N .

Vince il conteggio dei byte più basso in ogni lingua. Si applicano le regole standard del .

Casi 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

Risposte:


5

Brachylog , 23 22 20 19 byte

Grazie a Zgarb, H.PWiz e Fatalize per aver salvato una certa quantità di byte.

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

Provalo online!

Sono sicuro che c'è di più al golf qui ...

Spiegazione

~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

Gelatina , 17 byte

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

Provalo online!

Versione alternativa, 15 byte, sfida post-date

Nell'ultima versione, Ɗcombina tre maglie in una catena monadica. Ciò consente il seguente golf.

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

Provalo online!

Come funziona

Ṣ€Ṣ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

Stax , 28 26 25 24 23 byte CP437

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

Esegui ed esegui il debug online!

Crediti a @recursive per il salvataggio di 3 byte.

Stax è un po 'prolisso qui. Sono necessari due byte per ordinare un array per impostazione predefinita, due byte per ottenere il massimo / minimo di un array e due byte per appiattire un array. Comunque sto ancora pubblicando la soluzione e spero che possano esserci suggerimenti utili su come migliorarla .

Spiegazione

Usa la versione decompressa per spiegare.

%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

Questo dà 25.
ricorsivo

1
Questa è una specie di prestazione deludente per la stax, ma continuerò a cercare risparmi.
ricorsivo


È semplicemente ... fantastico.
Weijun Zhou

Grazie. Ho trovato divertente che il collegamento ipertestuale usasse esattamente la dimensione massima del commento, dopo aver sostituito "https: //" con "http: //".
ricorsivo

2

Brachylog , 17 byte

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

Provalo online!

Spiegazione

Questa è un'auto-risposta; Ho progettato questa sfida pensando a Brachylog e ho trovato ~c₎{…}ᵈun costrutto interessante.

Il built-in cconcatena un elenco di elenchi. Se viene assegnato un pedice N, richiede il numero di elenchi N. Il simbolo modifica un built-in per prendere una coppia come input e usare il suo elemento giusto come pedice. Quindi c₎prende una coppia [L,N], richiede che il numero di liste Lsia Ne restituisca la concatenazione di L. Quando viene eseguito in senso inverso, ~c₎prende una lista Le restituisce una coppia [P,N], in cui Pè una partizione di Lin Nblocchi. Sono elencati in ordine crescente diN .

Il metapredicato trasforma un predicato ordinario in uno che verifica una relazione tra i due elementi di una coppia. Più esplicitamente, {…}ᵈaccetta una coppia [A,B], controlla che A{…}Bcontiene e produce B. Lo uso per verificare che Ppossa essere ordinato per blocchi e contenga solo elenchi di lunghezza al massimo 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.

Si noti che Ppuò contenere elenchi vuoti. Ciò garantisce la correttezza anche nei casi in cui la lunghezza massima di un blocco è maggiore del numero di blocchi.


1

Python 2 , 186 146 byte

lambda l:min(max(map(len,z+[z]))for z in p(l)if sum(s(z),[])==s(l))
p=lambda l:[q+[s(l[i:])]for i in range(len(l))for q in p(l[:i])]or[l]
s=sorted

Provalo online!

La seconda funzione è presa da questa punta dal febbre .


1

Rubino , 158 byte

f=->l,i=[],s=l.size,m=s{k=*l;i.sum==s&&i.map{|z|k.shift(z).sort}.sort.flatten==l.sort&&[m,[i.size,*i].max].min||i.sum<s&&(1..s).map{|z|f[l,i+[z],s,m]}.min||m}

Provalo online!


1

Pyth ,  24 23  20 byte

hSmeSlMs]Bd.msSSMb./

Suite di test.

Come funziona

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 byte

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

⎕IO deve essere 0

Provalo online!

Come?

  • ⌊/- Trova il minimo di ...
  • (⌈/≢,≢¨)- ... il massimo della lunghezza e del numero di elementi ...
  • ¨- ... di ogni elemento di ...
  • T/⍨- ... gli elementi che ...
  • {S[⍋S]≡∊⍵[⍋↑⍵]}¨- ... sono ordinati quando appiattiti, di ...
  • T←{⍵[⍋⍵]}¨¨- ... gli elementi ordinati degli elementi di ...
  • ⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵- ... le partizioni dell'argomento (insieme ad alcune cianfrusaglie)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.