Driftsort es una forma simple de "ordenar" una matriz. Funciona "deslizando" o "girando" los elementos sobre la matriz hasta que se ordena la matriz, o hasta que la matriz no se puede ordenar.
Veamos dos ejemplos. Primero, considere la matriz [10, 2, 3, 4, 7]
. Como la matriz no está ordenada, la rotamos una vez. (Esto puede suceder en cualquier dirección, siempre que siga siendo la misma dirección). Luego, la matriz se convierte en:
[7, 10, 2, 3, 4]
Esto no está ordenado, por lo que giramos nuevamente.
[4, 7, 10, 2, 3]
Y otra vez:
[3, 4, 7, 10, 2]
Y un tiempo final:
[2, 3, 4, 7, 10]
¡Y está ordenado! Entonces, la matriz [10, 2, 3, 4, 7]
es derivable clasificable. Aquí están todas las rotaciones de la matriz, para mayor claridad:
[10, 2, 3, 4, 7]
[7, 10, 2, 3, 4]
[4, 7, 10, 2, 3]
[3, 4, 7, 10, 2]
[2, 3, 4, 7, 10]
Considere ahora la matriz [5, 3, 9, 2, 6, 7]
. Mira sus rotaciones:
[5, 3, 9, 2, 6, 7]
[7, 5, 3, 9, 2, 6]
[6, 7, 5, 3, 9, 2]
[2, 6, 7, 5, 3, 9]
[9, 2, 6, 7, 5, 3]
[3, 9, 2, 6, 7, 5]
Ninguno de estos arreglos está ordenado, por lo que el arreglo [5, 3, 9, 2, 6, 7]
no es derivable.
Objetivo Dada una matriz / lista de enteros no vacía como entrada a un programa / función, implementar driftsort en la entrada y salida, o generar un valor falsey ( o una matriz / lista vacía) si no se puede derivar. Los enteros están vinculados a sus idiomas max / min, pero esto debe ser al menos 255 para el máximo y 0 para el mínimo.
Puede utilizar métodos de clasificación integrados, pero no uno integrado que resuelva el desafío.
Este es un código de golf , por lo que el programa más corto en bytes.
Casos de prueba
input => output
[1] => [1]
[5, 0, 5] => [0, 5, 5]
[3, 2, 1] => false
[0, 9, 3] => false
[1, 2, 3, 4] => [1, 2, 3, 4]
[4, 1, 2, 3] => [1, 2, 3, 4]
[0, 2, 0, 2] => false
[5, 3, 9, 2, 6, 7] => false
[0, 0, 0, 0, 0, 0, 0] => [0, 0, 0, 0, 0, 0, 0]
[75, 230, 30, 42, 50] => [30, 42, 50, 75, 230]
[255, 255, 200, 200, 203] => [200, 200, 203, 255, 255]
sorted(l)
es una sublista contigua del+l
.shiftsort
?shift
operación que elimina el primer elemento de una matriz.Respuestas:
Jalea , 6 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Rubí, 33
a.any?
se dispara hasta una vez por cada elemento de la matriz, excepto que se detiene (y devuelve verdadero) tan pronto como la matriz ha mutado a un estado ordenado. Si esto sucede, devolvemos la matriz mutada. De lo contrario, devolvemos el valor falso queany?
devuelve.fuente
Python 2, 51 bytes
No se molesta en girar. En su lugar, ordena la lista, luego ve si el original se puede ordenar por deriva comprobando si hay como máximo una disminución entre los elementos consecutivos de la lista ciclada. El conteo se
<3
debe a quemap
rellena la lista más cortaNone
al final, agregando una disminución falsa.fuente
[1, 3, 2, 4]
solo tiene una disminución entre los elementos consecutivos, pero no se puede ordenar por deriva.<3
también<3
es para evitar tener que rotar la lista con precisión.Pyth, 9 bytes
Explicación:
Pruébalo aquí!
¡O use una suite de prueba!
fuente
.:
. Las combinaciones incluirían elementos no contiguos.Matlab,
614741 bytes¡Gracias @Suever por -6 bytes!
Si
strfind([a,a],sort(a))
intenta encontrar el vector de entrada ordenado como una 'subcadena' del no ordenado, eso se agregó a sí mismo. Si es verdadero, la entrada es derivable y obtenemos un vector de longitud 2, si no, obtenemos un vector vacío.min
simplemente transforma esto en un número / vector vacío. Agregar el vector ordenado a 0 solo lo muestra, agregarlo a un vector vacío arroja un error.fuente
[2, 3]
no ser una sublista de[12, 34]
?strfind
puede funcionar directamente con números, no solo con caracteres (aunque eso no esté documentado). Si los números se interpretaran como caracteres, se limitarían a65535
(prueba, por ejemplo+char(1e5)
)Julia,
716652 bytesEsta es una función anónima que acepta una matriz y devuelve una matriz o un booleano. Para llamarlo, asígnelo a una variable.
Para una matriz de entrada x , construimos el conjunto de todas las rotaciones de x y verificamos si la versión ordenada x es un elemento de esa lista. Si es así, devolvemos x ordenado, de lo contrario devolvemos falso.
¡Ahorró 19 bytes gracias a Dennis!
fuente
Pipa , 15 + 1 =
1716 bytesUgh, los otros idiomas de golf están sacando esto del agua. Sin embargo, como ya lo he escrito ...
Toma datos como argumentos de línea de comandos separados por espacios. Requiere
-p
u otro indicador de formato de matriz para mostrar el resultado de forma legible en lugar de concatenado. El caso falso genera una cadena vacía, que es visible en virtud de la nueva línea final.fuente
JavaScript (ES6),
727065 bytesRetornos
0
en caso de falla. La versión anterior8583 de80 bytes evitó llamarsort
:Editar: se guardaron 2 bytes al inicializar
c
en-1
lugar de0
. Guardado 5 bytes al cambiar dereduce
amap
, suspiro ...fuente
[10, 2, 3, 4, 7]
.[1]
,[0, 0, 0, 0, 0, 0, 0]
y[75, 230, 30, 42, 50]
.sort
descuido, que causó la tercera falla de la prueba. Las otras dos fallas de prueba fueron causadas por mi exceso de golf; He vuelto a la versión anterior.05AB1E , 12 bytes
Código:
Utiliza la codificación CP-1252 . Pruébalo en línea! .
fuente
Muñeco de nieve 1.0.2 , 27 bytes
Esta es una subrutina que toma entradas y salidas del permavar actual.
Pruébalo en línea!
fuente
MATL,
1312109 bytesLa misma idea que la respuesta de @ flawr donde secuestramos
strfind
(Xf
) para encontrar la versión ordenada de la entrada dentro de la concatenación de dos copias de la entrada.Pruébalo en línea!
Explicación
fuente
g
? O reemplazarng
pora
n
porquen
podría ser> 1.a
definitivamente funciona. Pensé que había una mejor manera. ¡Gracias!Julia, 33 bytes
Pruébalo en línea!
Cómo funciona
Esto concatena el conjunto x consigo mismo y cuenta el número de pares que están fuera de orden, es decir, el número de subconjuntos contiguos [a, b] para los cuales b - a <0 . Si c es el número de pares desordenados de x y t es 1 si el último elemento de x es mayor que el primero,
sum
devolverá 2c + t .La matriz x se puede derivar si iff (c, t) = (1, 0) ( x tiene que rotarse al valor más pequeño del único par desordenado), (c, t) = (0, 1) ( x se ordena) o (c, t) = (0, 0) ( x se ordena y todos sus elementos son iguales), lo cual es cierto si f 2c + t <3 .
fuente
Javascript ES6,
484543 caracteresPrueba:
fuente
(x+[,x])
y un byte adicional utilizando en~
lugar de1+
en su condición.Brachylog , 39 bytes
Realmente necesito agregar un argumento opcional para
$( - circular permute left
para permutar más de una vez ... esto habría sido 13 bytes. Esto esperará después de implementar un nuevo transpilador estable en Prolog.Explicación
fuente
Ruby, 47 bytes
Función recursiva. Devuelve
nil
si la matriz de entrada no puede desviarse.fuente
CJam,
1713 bytesGracias a Dennis por guardar 4 bytes.
Un bloque (función) sin nombre que toma y devuelve una lista.
Banco de pruebas.
Explicación
Básicamente, esto utiliza la observación de xnor de que la lista ordenada aparece en el doble de la lista original si es derivable:
fuente
C ++ 14, 242 caracteres
Si no puedo dejar la salida vacía, 252 caracteres http://ideone.com/HAzJ5V
Versión sin golf http://ideone.com/Dsbs8W
PD: Basado en la idea de @ MichelfrancisBustillos .
fuente
Java 7, 207 bytes
Prueba detallada aquí
fuente
Java 175
imprime la salida como valores separados por espacios, o imprime
f
para un valor falsey.pasa por todas las combinaciones de la matriz de enteros hasta que encuentra la secuencia válida o se queda sin combinaciones. la matriz no se modifica, sino que la secuencia ordenada a la deriva se almacena como una cadena delimitada por espacios.
un poco más legible:
pruébalo en línea
fuente
C, 105 bytes
Esto acepta los enteros de entrada como argumentos de línea de comandos separados e imprime la lista de salida como un entero por línea.
Si la lista no es derivable, el programa se cierra prematuramente debido a una excepción de coma flotante, por lo que su salida vacía representa una lista vacía.
Verificación
fuente
Ruby, 28
Devuelve la matriz ordenada o
nil
(que es un valor falso) si la entrada no se puede ordenar por deriva.fuente
Python, 53 bytes
Si desea probar esto, diríjase a https://www.repl.it/languages/python3 y copie y pegue esto:
Cómo funciona:
s
es una variable que almacena elsorted
función python que clasifica las listasN
es la función principals(x)
se multiplica por si la lista es o no derivablestr(s(x))[1:-1]in str(x+x)
(gracias a @xnor)[1,2,3,4]*false
da resultado una lista vacía[]
[1,2,3,4]*true
resultados en[1,2,3,4]
fuente
lambda x,s=sorted:(`s(x)`[1:-1]in`x+x`)*s(x)
44 bytes.Python, 83 bytes
Esto fue avergonzado por las otras respuestas de Python, pero también podría publicarlo de todos modos. Realmente no me gusta el
parte. ¿Hay alguna forma más rápida de recorrer la lista?
fuente
l.append(l.pop(0))or g==l for _ in l
ahorra un byte sobre el enfoque de rango-len. Usar alambda
ahorraría 14 bytes adicionales.MATLAB / Octave, 118 bytes
fuente
input('')
. ¡También evite espacios innecesarios y paréntesis! Y nuevamente puede arrojar algunos bytes definiendo primerof=@issorted
.PowerShell v2 +,
8780 bytesRecorre la lista de entrada
$a
, verificando cada elemento por pares (incluyendo el último y el primero) para ver si hay más de un par decreciente. Si el par particular está disminuyendo, disminuimos$c
. Emite la lista ordenada o un elemento único0
, en función del valor de$c
al final. Si está presente más de un par "malo",++$c
seguirá siendo negativo, de lo contrario será al menos0
, por lo que se elige el segundo elemento del pseudoternario ($a|sort
).Veo que Xnor hizo algo similar , pero se me ocurrió esto de forma independiente.
fuente
Factor, 47 bytes
une la secuencia sobre sí misma, luego verifica si la versión ordenada del original es una subsecuencia.
fuente
dup dup append \\ natural sort \\ dip subseq?
incluso se ajusta al patrón 4-4-3 :)C ++, 313
359370bytes¡Un gran agradecimiento a @Qwertiy por hacer que esto funcione y por enseñarme algunos excelentes métodos de golf!
Golfizado:
Sin golf:
fuente
using namespace std;
es 20 caracteres cuandostd::
6 veces es 30.bool s = False;
- ¿por qué no=0
? Puedes caerreturn 0;
. ¿Por qué hay corchetes aquí!s&&(c<=v.size())
? Figura llaves y sin comas ...std::
yreturn 0;
) se han convertido en un hábito de las clases de programación. Realmente necesito comenzar a revisar mis programas mejor.True
y enFalse
lugar detrue
yfalse
. ideone.com/kVTI25 - su versión, ideone.com/y8s44A - fija y preparada para la versión de golf.True
yFalse
es de Python. ¡Ni siquiera sabía que podías escribirif
cosas así!Mathcad, TBD
En Mathcad, 0 (escalar) == falso.
El recuento de bytes (equivalente) es TBD hasta que se acuerde el método de recuento. Aproximadamente 52 bytes usando una equivalencia de teclado byte = operator / symbol.
fuente
Mathematica
55 50 6158 bytesCon 3 bytes guardados gracias a Martin Büttner.
Mis intentos anteriores no pasaron todo el caso de prueba. Necesitaba agregar
Union
para evitar repeticiones en la lista que fueron ingresadas en orden.Pruebas
Explicación
Gire a la derecha la lista de entrada de 1 a
n
veces, donden
está la longitud de la lista de entrada. Si la lista de entrada ordenada se encuentra entre las listas giradas de salida, devuélvala; de lo contrario, devuelve una lista vacía.fuente
@@
y/@
en las listas vacías.Join@@
aún debe ser más corto queFlatten@
sin embargo.PHP, 98 bytes
Emite a
1
si deriva derivable, de lo contrario nadafuente