Desafío
Dado un conjunto no entero de enteros, por ejemplo:
[5, 2, 7, 6, 4, 1, 3]
Primero sepárelo en matrices donde ningún elemento sea más grande que el anterior (es decir, matrices no ascendentes):
[5, 2] [7, 6, 4, 1] [3]
A continuación, invierta cada matriz:
[2, 5] [1, 4, 6, 7] [3]
Finalmente, concatenelos todos juntos:
[2, 5, 1, 4, 6, 7, 3]
Esto debería ser lo que su programa emite / devuelve. Repita este procedimiento suficientes veces y la matriz estará completamente ordenada.
Reglas
- La entrada y salida se pueden dar a través de cualquier método estándar, y pueden estar en cualquier formato de matriz razonable.
- La matriz de entrada nunca estará vacía, pero puede contener negativos y / o duplicados.
- El valor absoluto de cada entero siempre será menor que 2 31 .
Casos de prueba
Esperemos que estos cubran todos los casos extremos:
[1] -> [1]
[1, 1] -> [1, 1]
[1, 2] -> [1, 2]
[2, 1] -> [1, 2]
[2, 3, 1] -> [2, 1, 3]
[2, 1, 3] -> [1, 2, 3]
[2, 1, 2] -> [1, 2, 2]
[2, 1, 1] -> [1, 1, 2]
[3, 1, 1, 2] -> [1, 1, 3, 2]
[3, 2, 1, 2] -> [1, 2, 3, 2]
[3, 1, 2, 2] -> [1, 3, 2, 2]
[1, 3, 2, 2] -> [1, 2, 2, 3]
[1, 0, 5, -234] -> [0, 1, -234, 5]
[1, 0, 1, 0, 1] -> [0, 1, 0, 1, 1]
[1, 2, 3, 4, 5] -> [1, 2, 3, 4, 5]
[5, 4, 3, 2, 1] -> [1, 2, 3, 4, 5]
[2, 1, 5, 4, 3] -> [1, 2, 3, 4, 5]
[2, 3, 1, 5, 4] -> [2, 1, 3, 4, 5]
[5, 1, 4, 2, 3] -> [1, 5, 2, 4, 3]
[5, 2, 7, 6, 4, 1, 3] -> [2, 5, 1, 4, 6, 7, 3]
[-5, -2, -7, -6, -4, -1, -3] -> [-5, -7, -2, -6, -4, -3, -1]
[14, 5, 3, 8, 15, 7, 4, 19, 12, 0, 2, 18, 6, 11, 13, 1, 17, 16, 10, 9] -> [3, 5, 14, 8, 4, 7, 15, 0, 12, 19, 2, 6, 18, 11, 1, 13, 9, 10, 16, 17]
Puntuación
Este es el código de golf , por lo que gana el código más corto en bytes.
code-golf
array-manipulation
sorting
ETHproducciones
fuente
fuente
O(n^2)
O(n)
. intercambie los primeros y últimos elementos, luego intercambie los segundos y segundos elementos, etc., cuando llegue a la parada intermedia.O(n)
, pero la inversión puede integrarse directamente en el algoritmo (eso es lo que hace mi respuesta JS); Como cada iteración recorre cada elemento de la matriz una vez, se realiza una única iteraciónO(n)
. (Creo que ...)Respuestas:
JavaScript (ES6), 64 bytes
Recursion FTW! El algoritmo básico en uso aquí es realizar un seguimiento de la ejecución actual no ascendente en una matriz, "devolviéndola" cada vez que se encuentra un elemento ascendente. Hacemos esto de forma recursiva, continuamente concatenando los resultados, hasta que nos quedemos sin elementos. Al crear cada ejecución en reversa (en
[n,...z]
lugar de[...z,n]
), podemos evitar la larga.reverse()
sin costo.Fragmento de prueba
Mostrar fragmento de código
fuente
[n,...a]
? ¿Qué esn
? ¿Es solo el primer elemento de tu matriz?n
es el primer elemento de la matriz ya
es el resto de la matriz. Puedes encontrar más información aquí ....a
? ¿Es eso solo para que puedas aprovecharn
? Una cosa más, cuando llamasf(a,q)
, ¿q
se establece en el parámetroz
?f=([n])=>...
solo capturaría el primer elemento yf=([n,a])=>...
capturaría solo el primeron
y el segundoa
. Otra forma de hacer lof=([n,...a])=>,,,
que haría seríaf=a=>(n=a.unshift(),...
.z
es el segundo parámetro en la función, cuandof(a,q)
se llama, lof
ve comoz
. ¡Espero que esto ayude!Python 3 , 63 bytes
Pruébalo en línea!
fuente
Jalea , 8 bytes
Pruébalo en línea!
Explicación:
fuente
JavaScript (ES6), 70 bytes
Claro, esto ya está superado por la respuesta de ETHproductions , pero eso es lo mejor que se me ocurrió hasta ahora sin usar la recursividad.
Nota: Inicializar ambos
r
yo
con el mismo objeto exactor = o = []
puede parecer una idea peligrosa. Pero es seguro hacerlo aquí porquer
se le asigna inmediatamente su propia instancia (que contiene el primer elemento dea
) en la primera iteración conr = [n, ...r]
.Casos de prueba
Mostrar fragmento de código
fuente
MATL , 15 bytes
La entrada es un vector de columna, con el formato
[5; 2; 7; 6; 4; 1; 3]
(punto y coma es el separador de fila).Pruébalo en línea!
Tome la entrada
[5; 2; 7; 6; 4; 1; 3]
como un ejemplo.Explicación
fuente
Mathematica,
3027 bytes3 bytes guardados debido a @Martin Ender .
Función anónima. Toma una lista de números como entrada y devuelve una lista de números como salida.
fuente
Python 2, 100 bytes
Un golf realmente terrible, pero quería publicar mi solución (uno no solo supera a Dennis) ...
Prueba en repl.it!
La entrada debe darse como un literal de lista de Python, como
[5, 3, 4, 2, 6, 1]
.La idea básica es hacer un uso intensivo de la sintaxis de corte de Python, cortando cada sección necesaria de la matriz, invirtiéndola y agregándola a la nueva matriz.
fuente
d,L,x=input(),[],0;d+=...
.Pyke,
118 bytes ( versión anterior )Pruébalo aquí! (funciona en la última versión)
fuente
Retina , 163 bytes
Sí, sé lo horrible que es esto. Apoyar ceros y negativos fue muy divertido. El recuento de bytes asume la codificación ISO 8859-1.
Pruébalo en línea
Explicación:
fuente
05AB1E ,
19181614 bytesGuardado 2 bytes usando el truco de clasificación de Luis Mendo
Pruébalo en línea!
Explicación
Entrada de ejemplo
[5, 2, 7, 6, 4, 1, 3]
Solución anterior de 16 bytes
fuente
JavaScript (ECMA 6),
121128125119108 bytesExpresión Lambda toma un único
Array
parámetro,a
.Gracias a @ETHproductions por ayudarme a ver mi primer error.
fuente
return(b+","+c).split`,`
para guardar algunos bytes al final.c.unshift
lugar dec.push
eliminar la necesidad de revertirc
. Después de hacer esto, obtuve 94 bytes .Ruby,
6055 bytesMás o menos lo que pidió el desafío. He definido una lambda
s
, que toma una matrizx
, y Sever (rodajas) en pedazos más pequeños, donde el elemento siguiente sería mayor que. Esto devuelve un enumerador, al que podemos llamar map e invertir el orden de las piezas, antes de finalmente juntarlo todo con flatten, que concatena los elementos en el orden definido en una matriz.Pruebas
fuente
Brachylog , 10 bytes
Pruébalo en línea!
Explicación
fuente
c
, cuando se ejecuta en reversa, necesariamente intenta dividirse en menos listas primero?Dyalog APL ,
715 bytesRequiere
⎕ML←3
, que es el predeterminado en muchos sistemas. *∊
alistarse (aplanar)⌽¨
cada uno invertido⍵⊂⍨
el argumento particionado * cortando donde cada elemento correspondiente es más grande que su predecesor en1+
uno más⍵-
el argumento menos⌊/⍵
el elemento más pequeño del argumentoLa antigua solución de 7 bytes falla con enteros no positivos:
Requiere
⎕ML←3
, que es el predeterminado en muchos sistemas. *∊
alistar (aplanar) el⌽¨
cada uno invertido⊂⍨
autoparticionado ** Partition (
⊂
) es una función que corta su argumento derecho donde el argumento izquierdo correspondiente es más grande que el anterior. (Desafortunadamente, solo acepta enteros no negativos, y cero tiene un significado especial.) A partir de la versión 16, esta funcionalidad⊂
está disponible en todos los sistemas (incluso aquellos donde⎕ML≠3
), utilizando el glifo⊆
.fuente
Haskell, 49 bytes
Ejemplo de uso:
(%[]) [5,2,7,6,4,1,3]
->[2,5,1,4,6,7,3]
.Enfoque recursivo. La función
%
toma la lista de entrada como su primer parámetro y un acumuladorl
que realiza un seguimiento del fragmento no ascendente hasta ahora (en orden inverso). El caso base se alcanza cuando la lista de entrada está vacía y luego el resultado es el acumulador. Si la lista de entrada no está vacía y el primer elementoa
no cabe en el fragmento actual (any(<a)l
), devuelva el acumulador y agregue una llamada recursiva en el resto de la lista ya
como el nuevo acumulador (l++b%[a]
). De lo contrario, haga una llamada recursiva en el resto de la lista ya
anteponga al acumulador (b%(a:l)
). La función principal(%[])
llama%
con un acumulador vacío.fuente
Retina , 98 bytes
El recuento de bytes asume la codificación ISO 8859-1.
Pruébalo en línea!
fuente
R, 64 bytes
Lee la entrada de stdin. Dividimos la entrada en una lista de vectores usando lo
split()
que requiere una variable de factor que agrupa la entrada. El factor se crea tomando la suma acumulativa del vector lógico para el cual la diferencia es positiva.Considere el vector:
Ahora, tomar la diferencia y anteponer
F
ejecutandoy=c(F,diff(x)>0)
produciría el siguiente vector lógico:Tomar la suma acumulativa
cumsum(y)
produce un vector donde cada grupo está representado por un factor único sobre el cual podemos combinar con lasplit
función:fuente
diffinv
lugar decumsum
.Octava,
7544 bytesBasado en la respuesta MATL de @LuisMendo
Pruébalo en línea!
Respuesta anterior
Pruébalo en línea!
invertir la matriz
tomar primera diferencia de
f
encontrar la posición de donde el siguiente elemento es menor que el elemento anterior
la primera diferencia de las posiciones devuelve la longitud de cada submatriz
use la longitud de cada subconjunto
mat2cell
para dividir el conjunto en una lista anidada de conjuntosinvertir la lista anidada
aplanar la lista anidada
fuente
Pyth - 15 bytes
Pruébelo en línea aquí .
fuente
Perl 6 , 59 bytes
Solución basada en expresiones regulares.
¡Porque esta es
SpartaPerl!m/ /
: Stringify la matriz de entrada, y hacer coincidir una expresión regular contra ella.(\-? \d+)
: Unir un número y capturarlo como$0
.<?{ [>=] $0 }>
: Aserción de ancho cero que solo coincide si todos los$0
capturados hasta el momento en la coincidencia actual están en orden no ascendente.([ ] +)+
: Repita los dos últimos pasos tan a menudo como sea posible, de lo contrario, comience una nueva sub-partidamap , [0]
: Iterar sobre los sub-partidos.|+«*.[0].reverse
: Para cada uno, tome la lista de valores coincidentes$0
, inviértala, coaccione los valores a números (+«
) y deslícelos en la lista externa (|
).Perl 6 , 63 bytes
Solución de procesamiento de listas recursivas.
Más laborioso de lo que esperaba.
Aunque el lenguaje tiene muchas funciones integradas convenientes, parece que no hay ninguna para la partición de listas (por ejemplo, como las de Ruby
slice_when
o HaskelltakeWhile
).fuente
Apilado , no competitivo, 34 bytes
Aún desarrollando constantemente este lenguaje.
El argumento se basa en TOS. Pruébalo aquí!
chunkby
toma una función y recopila matrices de datos contiguos que satisfacen la función. La función entonces es:Esto da una matriz estrictamente decreciente.
$revmap
es básicamente[rev]map
y revierte cada elemento.flat
finalmente aplana la matriz.Un poco de diversión para realmente ordenar la matriz:
Esto genera (por ejemplo):
fuente
Python,
151139 Bytes¡Guardado 12 bytes gracias a @ Flp.Tkc!
En ninguna parte cerca de @ Flp.Tkc, y mucho menos ...
fuente
+= data,
la coma final construye implícitamente una tupla, que luego se concatena con la lista, agregando los datos como el último elemento de la lista. En este contexto, hacerr+=l[i:j+1][::-1],
Python 2, 74 bytes
Entrada
a
, salida enc
fuente
Python 3, 191 bytes
No estoy seguro de si
sorted
está permitido usar la función para verificar aquí, pero no se me ocurre una buena razón para ello, y redujo mi recuento de bytes en ~ 30 bytes.fuente
Clojure, 105 bytes
Particiones en pares de números consecutivos, pone
true
ofalse
entre ellos, particiones ennot
quetrue
y los números se hacenfalse
yfalse
true
, invierte particiones y mantiene los valores numéricos.fuente