Ordenar por barajar bloques

18

Bloquear orden aleatorio

La ordenación aleatoria de bloques es un método (más bien artificial) de ordenar una lista. Funciona de la siguiente manera, ilustrada por un ejemplo.

[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 partición en bloques contiguos se puede elegir arbitrariamente. Sin embargo, no todas las opciones de bloques producirán una lista ordenada al final:

[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 todos los bloques tienen longitud 1, o si solo hay un bloque, entonces el resultado se ordenará, por supuesto. Pero estos son casos bastante extremos. En este desafío, su tarea es encontrar un equilibrio entre el número de bloques y la longitud máxima de un bloque.

La tarea

Su entrada es una lista no vacía de enteros L , tomada en cualquier formato razonable. Su salida será el número entero más pequeño N tal que L puede ser bloque aleatoria ordenadas de modo que el número de bloques y la longitud de cada bloque están en más N .

El conteo de bytes más bajo en cada idioma gana. Aplican reglas estándar de .

Casos de prueba

[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
Zgarb
fuente

Respuestas:

5

Brachylog , 23 22 20 19 bytes

Gracias a Zgarb, H.PWiz y Fatalize por guardar cierta cantidad de bytes.

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

Pruébalo en línea!

Estoy seguro de que hay más para jugar golf aquí ...

Explicación

~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.
Martin Ender
fuente
3

Jalea , 17 bytes

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

Pruébalo en línea!

Versión alternativa, 15 bytes, desafío de fecha posterior

En la última versión, Ɗcombina tres enlaces en una cadena monádica. Esto permite el siguiente golf.

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

Pruébalo en línea!

Cómo funciona

Ṣ€Ṣ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.
Dennis
fuente
2

Stax , 28 26 25 24 23 bytes CP437

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

¡Ejecute y depure en línea!

Créditos a @recursive para guardar 3 bytes.

Stax es un poco detallado aquí. Se requieren dos bytes para ordenar una matriz de forma predeterminada, dos bytes para obtener el máximo / mínimo de una matriz y dos bytes para aplanar una matriz. De todos modos, todavía estoy publicando la solución y espero que pueda haber sugerencias útiles sobre cómo mejorarla .

Explicación

Utiliza la versión desempaquetada para explicar.

%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
Weijun Zhou
fuente
Esto da 25.
recursivo
1
Este es un tipo de rendimiento decepcionante para Stax, pero voy a seguir buscando ahorros.
recursivo el
staxlang.xyz/…
recursivo el
Eso es simplemente ... asombroso.
Weijun Zhou
Gracias. Me pareció divertido que el hipervínculo utilizara exactamente el tamaño máximo de comentario, después de reemplazar "https: //" con "http: //".
recursivo
2

Brachylog , 17 bytes

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

Pruébalo en línea!

Explicación

Esta es una respuesta propia; Diseñé este desafío con Brachylog en mente y encontré ~c₎{…}ᵈuna construcción interesante.

El incorporado cconcatena una lista de listas. Si se le da un subíndice N, se requiere el número de listas N. El símbolo modifica un incorporado para tomar un par como entrada y usar su elemento correcto como subíndice. Por lo tanto, c₎toma un par [L,N], requiere que el número de listas en Les Ny devuelve la concatenación de L. Cuando se ejecuta en reversa, ~c₎toma una lista Ly devuelve un par [P,N], donde Phay una partición Len Nbloques. Se enumeran en orden creciente de N.

El metapredicado transforma un predicado ordinario en uno que verifica una relación entre los dos elementos de un par. Más explícitamente, {…}ᵈtoma un par [A,B], comprueba que se A{…}Bmantiene y emite B. Lo uso para verificar que Pse puede ordenar por bloques y solo contiene listas de longitud como máximo 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.

Tenga en cuenta que Ppuede contener listas vacías. Esto garantiza la corrección también en aquellos casos en que la longitud máxima de un bloque es mayor que el número de bloques.

Zgarb
fuente
1

Python 2 , 186146 bytes

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

Pruébalo en línea!

La segunda función es tomada de este consejo por feersum .

ovs
fuente
1

Ruby , 158 bytes

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}

Pruébalo en línea!

Asone Tuhid
fuente
1

Pyth ,  24 23  20 bytes

hSmeSlMs]Bd.msSSMb./

Banco de pruebas.

Cómo funciona

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.
Sr. Xcoder
fuente
0

APL (Dyalog Classic) , 71 67 bytes

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

⎕IO debe ser 0

Pruébalo en línea!

¿Cómo?

  • ⌊/- Encuentra el mínimo de ...
  • (⌈/≢,≢¨)- ... el máximo de la longitud y el número de elementos ...
  • ¨- ... de cada elemento de ...
  • T/⍨- ... los elementos que ...
  • {S[⍋S]≡∊⍵[⍋↑⍵]}¨- ... se ordenan cuando se aplanan, de ...
  • T←{⍵[⍋⍵]}¨¨- ... los elementos ordenados de los elementos de ...
  • ⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵- ... las particiones del argumento (junto con algo de basura)
Zacharý
fuente