La pregunta
Dado un conjunto de 9 números, m[]
que contiene solo los números del 1 al 9 en un orden aleatorio, sin que haya dos números iguales, cree un programa en cualquier idioma que reorganice el número para que esté en orden numérico (1, 2, 3, etc. etc.) solo cambiando dos números que están uno al lado del otro (es decir, 1, 3, 2 → 1, 2, 3).
Reglas
- Solo puede modificar el conjunto cambiando dos números que están uno al lado del otro
- Los números finales (del 1 al 9 en orden) deben estar contenidos en
m[]
- Puedes usar cualquier idioma que quieras
- La respuesta con la menor cantidad de bytes gana
Editar:
Su código no tiene que imprimir la salida, pero la matriz reorganizada debe estar en m[]
.
code-golf
array-manipulation
sorting
Mezcla Miau
fuente
fuente
Respuestas:
CJam, 15 bytes
Cómo funciona:
Pruébalo en línea aquí
fuente
Mathematica, 38 bytes
Esta es una función sin nombre que toma una matriz, que aplica una regla de reemplazo hasta que ya no se pueda encontrar el patrón. El patrón es una lista que tiene dos elementos consecutivos
b
yc
dóndeb > c
, y la regla dice que intercambieb
y, de loc
contrario, deje la matriz intacta.Aquí hay mucho azúcar sintáctico, pero el código es realmente muy legible si conoces un poco de Mathematica:
fuente
Python 3, 72 bytes
El bogosort (también conocido como clasificación estúpida): intercambia elementos vecinos al azar hasta que se ordene la matriz. Por lo general, corre menos de un segundo.
2 bytes gracias a @xnor.
fuente
Pitón 2, 45
Ciclos alrededor de la lista, ordenando pares consecutivos de elementos. El índice se
i
desplaza0,1,2,3,4,5,6,7
ocho veces, lo que garantiza que todos los elementos salgan y la lista se ordena.fuente
Pyth, 13-15 bytes
Solución que realiza el intercambio solicitado y no produce resultados:
Solución que realiza el intercambio solicitado e imprime el estado intermedio de la lista en cada paso:
Solución que realiza el intercambio solicitado e imprime el estado final de la lista:
Demostración de la solución intermedia anterior.
El método de intercambio de valores adyacentes se toma de la respuesta de @ Jakube.
El programa usa
#
, el ciclo hasta la declaración de error, para intercambiar un par adyacente de elementos desordenados hasta que no exista dicho par, en cuyo puntoh
, la función de cabecera, arroja un error, finalizando el programa.fuente
Retina ,
9593 bytesNo es particularmente competitivo (y probablemente todavía golfable), pero aquí vamos ...
Donde
<empty>
debería haber una línea vacía.Como todos los números son de un solo dígito, esto solo espera una cadena con los 9 dígitos como entrada y se imprimirá
123456789
después de ordenarla correctamente. Cada etapa realiza un intercambio único y el)1`
indica que todas menos la última etapa deben repetirse hasta que el resultado deje de cambiar.La etapa vacía al final es necesaria, porque de lo contrario obtendríamos resultados intermedios cada vez que
98
se procese la etapa.Aquí están todos los resultados intermedios (cada vez que cambia) para un ejemplo de ejecución:
(Obtuve esto agregando la
:
opción a cada etapa y eliminé los duplicados consecutivos manualmente).fuente
Pyth, 17 bytes
Cambiar elementos en una lista es realmente costoso en Pyth. Así que aquí hay una solución divertida, que estira un poco las reglas. Probablemente no sea válido.
Pruébelo en línea: Pyth Compiler / Executor
Explicación
En primer lugar, la complejidad temporal de mi código es
O(n^3)
. Pero esta no es la parte interesante. La pregunta no dice nada sobre la complejidad.La parte crítica es cómo cambio dos elementos en la lista. Digamos que quiero cambiar los elementos
m[3]
ym[4]
. No me importan los índices3
y4
en absoluto. Simplemente creo una segunda lista, que reemplaza cada elemento igualm[3]
con el númerom[4]
y cada número igualm[4]
con el valorm[3]
. Como la lista no contiene duplicados, esto simula cambiar estos dos valores. Si hubiera duplicados, como en la entrada[1, 3, 2, 2]
, la salida sería[1, 2, 3, 3]
. Y si das la entrada[1, 2, 1]
, terminaría en un bucle infinito. No creo explícitamente la segunda lista, es solo parte de la implementación de Pyth del método de traducción. Si imprime las listas actuales ( consulte aquí), proporciona los valores correctos, que usted esperaría.fuente
JavaScript (ES6) 56
Una función recursiva que reorganiza la lista dada en su lugar.
Notas
En JS, para cualquier valor numérico v: v> undefined == false, v <undefined == false. Entonces, salir de los límites de la matriz no es un problema si utilizamos la comparación correcta
Cuando finalmente se ordena la matriz, la función dentro de 'some' devuelve false y la recursión termina
El valor devuelto en el caso de un intercambio es una matriz de 2 elementos, y su valor siempre es 'verdadero'. Eso funciona incluso cuando uno o más elementos de la matriz son 0
De hecho, la función funciona con cualquier entrada numérica, no solo dígitos únicos y no repetidos. No encontré una manera de aprovechar esta restricción de OP.
Prueba con un fragmento (en Firefox): la versión del fragmento muestra los valores de la lista actual en cada paso.
fuente
Javascript ( ES6 ),
666153 bytesGracias a la nueva regla, puedo reducir aún más :)
Comentado
fuente
C, 183
Todavía no se juega golf, aparte de los nombres de variables.
fuente
Haskell, 59 bytes
La función
s
coloca un elementoe
al frente o en el segundo lugar de una lista dependiendo de si es menor o mayor que el primer elemento de la lista. Al plegarses
en la lista de entrada, el elemento más pequeño aparece al frente. Me estoy plegando en una lista que contiene una sola9
que elimino inmediatamente despuésinit
, para que no tenga que buscar listas vacíass
.iterate
repite el proceso de plegado para siempre creando una lista de resultados intermedios. El resultado final es el noveno elemento de esta lista.fuente
Perl, 68 bytes
Código sin golf
fuente