Mientras garabateaba con números, encontré una interesante permutación que puede generar a partir de una lista de números. Si repite esta misma permutación suficientes veces, siempre terminará en la matriz original. Usemos la siguiente lista:
[1, 2, 3, 4, 5]
como ejemplo
Invierte la matriz. Ahora nuestra matriz es
[5, 4, 3, 2, 1]
Reordenar (intercambiar) cada par. Nuestra lista tiene 2 pares:
[5, 4]
y[3, 2]
. Desafortunadamente, no podemos agruparlos1
en un par, así que lo dejaremos solo. Después de intercambiar cada par, la nueva matriz es:[4, 5, 2, 3, 1]
Repita los pasos 1 y 2 hasta que volvamos a la matriz original. Aquí están los siguientes 4 pasos:
Step 2: Start: [4, 5, 2, 3, 1] Reversed: [1, 3, 2, 5, 4] Pairs Swapped: [3, 1, 5, 2, 4] Step 3: Start: [3, 1, 5, 2, 4] Reversed: [4, 2, 5, 1, 3] Pairs Swapped: [2, 4, 1, 5, 3] Step 4: Start: [2, 4, 1, 5, 3] Reversed: [3, 5, 1, 4, 2] Pairs Swapped: [5, 3, 4, 1, 2] Step 5: Start: [5, 3, 4, 1, 2] Reversed: [2, 1, 4, 3, 5] Pairs Swapped: [1, 2, 3, 4, 5] # No more steps needed because we are back to the original array
Si la longitud de la lista, n es impar, siempre tomará exactamente n pasos para volver a la matriz original. Si n es par, siempre tomará 2 pasos para volver a la matriz original, a menos que n sea 2, en cuyo caso tomará 1 paso (porque revertir e intercambiar es lo mismo).
Su tarea para hoy (si decide aceptarlo) es visualizar este conjunto de pasos para listas de longitudes arbitrarias. Debe escribir un programa o función que tome un solo entero positivo n como entrada y realice este conjunto de pasos para la lista [1, n]
. Debe generar cada paso intermedio en el camino, ya sea que eso signifique imprimir cada paso o devolverlos todos como una lista de pasos. No soy muy exigente con el formato de salida, siempre que esté claro que estás generando cada paso. Esto significa (por ejemplo) cualquiera de estos:
Enviar cada paso como una lista a STDOUT
Devolver una lista de listas
Devolver una lista de representaciones de cadena de cada paso
Devolución / salida de una matriz
Sería aceptable.
También debe generar la matriz original, ya sea que llegue al final o al principio, depende de usted. (técnicamente, ambos son correctos)
Tendrá que manejar el caso límite de 2 dando 1 paso en lugar de 2 , así que asegúrese de que su solución funcione con una entrada de 2 (y 1 es otro caso límite potencial).
Como de costumbre, este es el código de golf , por lo que se aplican las lagunas estándar, y trata de hacer que tu solución sea más corta que cualquier otra en el idioma que elijas (o incluso tratar de superar otro idioma que generalmente es más corto que el tuyo si te sientes bien) para un desafío).
Prueba IO
1:
[1]
2:
[1, 2]
3:
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
4:
[3, 4, 1, 2]
[1, 2, 3, 4]
5:
[4, 5, 2, 3, 1]
[3, 1, 5, 2, 4]
[2, 4, 1, 5, 3]
[5, 3, 4, 1, 2]
[1, 2, 3, 4, 5]
7:
[6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 6]
[4, 6, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 7, 5]
[7, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7]
9:
[8, 9, 6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 9, 6, 8]
[6, 8, 4, 9, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 9, 2, 8, 4, 6]
[4, 6, 2, 8, 1, 9, 3, 7, 5]
[7, 5, 9, 3, 8, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 8, 5, 9, 7]
[9, 7, 8, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Y por si acaso, aquí hay un caso de prueba gigante:
27:
[26, 27, 24, 25, 22, 23, 20, 21, 18, 19, 16, 17, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 9, 6, 11, 8, 13, 10, 15, 12, 17, 14, 19, 16, 21, 18, 23, 20, 25, 22, 27, 24, 26]
[24, 26, 22, 27, 20, 25, 18, 23, 16, 21, 14, 19, 12, 17, 10, 15, 8, 13, 6, 11, 4, 9, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 9, 2, 11, 4, 13, 6, 15, 8, 17, 10, 19, 12, 21, 14, 23, 16, 25, 18, 27, 20, 26, 22, 24]
[22, 24, 20, 26, 18, 27, 16, 25, 14, 23, 12, 21, 10, 19, 8, 17, 6, 15, 4, 13, 2, 11, 1, 9, 3, 7, 5]
[7, 5, 9, 3, 11, 1, 13, 2, 15, 4, 17, 6, 19, 8, 21, 10, 23, 12, 25, 14, 27, 16, 26, 18, 24, 20, 22]
[20, 22, 18, 24, 16, 26, 14, 27, 12, 25, 10, 23, 8, 21, 6, 19, 4, 17, 2, 15, 1, 13, 3, 11, 5, 9, 7]
[9, 7, 11, 5, 13, 3, 15, 1, 17, 2, 19, 4, 21, 6, 23, 8, 25, 10, 27, 12, 26, 14, 24, 16, 22, 18, 20]
[18, 20, 16, 22, 14, 24, 12, 26, 10, 27, 8, 25, 6, 23, 4, 21, 2, 19, 1, 17, 3, 15, 5, 13, 7, 11, 9]
[11, 9, 13, 7, 15, 5, 17, 3, 19, 1, 21, 2, 23, 4, 25, 6, 27, 8, 26, 10, 24, 12, 22, 14, 20, 16, 18]
[16, 18, 14, 20, 12, 22, 10, 24, 8, 26, 6, 27, 4, 25, 2, 23, 1, 21, 3, 19, 5, 17, 7, 15, 9, 13, 11]
[13, 11, 15, 9, 17, 7, 19, 5, 21, 3, 23, 1, 25, 2, 27, 4, 26, 6, 24, 8, 22, 10, 20, 12, 18, 14, 16]
[14, 16, 12, 18, 10, 20, 8, 22, 6, 24, 4, 26, 2, 27, 1, 25, 3, 23, 5, 21, 7, 19, 9, 17, 11, 15, 13]
[15, 13, 17, 11, 19, 9, 21, 7, 23, 5, 25, 3, 27, 1, 26, 2, 24, 4, 22, 6, 20, 8, 18, 10, 16, 12, 14]
[12, 14, 10, 16, 8, 18, 6, 20, 4, 22, 2, 24, 1, 26, 3, 27, 5, 25, 7, 23, 9, 21, 11, 19, 13, 17, 15]
[17, 15, 19, 13, 21, 11, 23, 9, 25, 7, 27, 5, 26, 3, 24, 1, 22, 2, 20, 4, 18, 6, 16, 8, 14, 10, 12]
[10, 12, 8, 14, 6, 16, 4, 18, 2, 20, 1, 22, 3, 24, 5, 26, 7, 27, 9, 25, 11, 23, 13, 21, 15, 19, 17]
[19, 17, 21, 15, 23, 13, 25, 11, 27, 9, 26, 7, 24, 5, 22, 3, 20, 1, 18, 2, 16, 4, 14, 6, 12, 8, 10]
[8, 10, 6, 12, 4, 14, 2, 16, 1, 18, 3, 20, 5, 22, 7, 24, 9, 26, 11, 27, 13, 25, 15, 23, 17, 21, 19]
[21, 19, 23, 17, 25, 15, 27, 13, 26, 11, 24, 9, 22, 7, 20, 5, 18, 3, 16, 1, 14, 2, 12, 4, 10, 6, 8]
[6, 8, 4, 10, 2, 12, 1, 14, 3, 16, 5, 18, 7, 20, 9, 22, 11, 24, 13, 26, 15, 27, 17, 25, 19, 23, 21]
[23, 21, 25, 19, 27, 17, 26, 15, 24, 13, 22, 11, 20, 9, 18, 7, 16, 5, 14, 3, 12, 1, 10, 2, 8, 4, 6]
[4, 6, 2, 8, 1, 10, 3, 12, 5, 14, 7, 16, 9, 18, 11, 20, 13, 22, 15, 24, 17, 26, 19, 27, 21, 25, 23]
[25, 23, 27, 21, 26, 19, 24, 17, 22, 15, 20, 13, 18, 11, 16, 9, 14, 7, 12, 5, 10, 3, 8, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 8, 5, 10, 7, 12, 9, 14, 11, 16, 13, 18, 15, 20, 17, 22, 19, 24, 21, 26, 23, 27, 25]
[27, 25, 26, 23, 24, 21, 22, 19, 20, 17, 18, 15, 16, 13, 14, 11, 12, 9, 10, 7, 8, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]
Diviértete jugando al golf!
fuente
1 2 3 4 5
, no1 2 4 3 5
.array[0]
solo será 1 al inicio y al final del proceson = 999
. Al observar el patrón, parece que por cada n impar , el primer elemento sube1, n-1, 3, n - 3, 5, n - 5, 7...
hastan - 2, 3, n, 1
, que siempre tomará n pasos. No veo ninguna razón para que este patrón cambie con una n mayor .1, n, 2, n-2, 4, n-4, 6, n-6, 8, n-8, ...
y es fácil mostrar por inducción que un elemento en la posición pareja x se mueve a nx después de un paso , y un elemento en la posición impar x se mueve a n-x + 2 . Entonces, si n = 2k + 1 , luego del 2k -ésimo paso 1 estará en 2k , y en el siguiente paso en n-2k = 1 .Respuestas:
TI-Basic (serie 83),
585754 bytes (104 caracteres)Explicación
Toma entrada
Ans
(por ejemplo, escribe5:prgmNAME
para usar listas de tamaño cinco).Crea tres listas auxiliares del tamaño dado (que se recrean
ᶫB
en cada paso):ᶫB = ᶫC = {1,2,3,4,5,...}
yᶫD = {-1,-1,-2,-2,-3,...}
. En cada paso, ordenaᶫC
yᶫD
desciende aplicando la misma permutación aᶫA
. En el caso deᶫC
, esto revierteᶫA
, y en el caso deᶫD
, intercambia pares adyacentes porque TI-Basic utiliza una implementación de selección de selección realmente estúpida para laSortD(
que reordena tantos elementos idénticos como sea posible. CuandoᶫA
es igual aᶫB
otra vez, nos detenemos.No, en serio, su algoritmo de clasificación incorporado es mi segunda queja más grande con el intérprete de TI-Basic. (Mi mayor queja es cómo muchos bucles anidados ralentizan al intérprete, ya que los datos del bucle se almacenan en una pila, pero la pila crece desde el extremo equivocado, por lo que la calculadora tiene que mover la pila completa cada vez que se empuja un elemento o reventado.) Pero esta vez, es conveniente.
-1 byte:
Pause
almacena el valor al que está imprimiendoAns
, que es más corto de referencia queᶫA
.-3 bytes: tomar entrada en
Ans
fuente
Jalea , 10 bytes
Pruébalo en línea!
Explicación
Nota
Si el rango original necesita estar al final, agregue
ṙ1
el código para 12 bytes.fuente
05AB1E ,
1311 bytesPruébalo en línea!
Explicación
fuente
JavaScript (ES6),
8985Editar 4 bytes guardados gracias @JustinMariner
Usando el hecho de que cuando cualquier elemento está en el lugar correcto, todos los elementos lo están.
Menos golf
Prueba
fuente
for(l=[];n;l[n-1]=n--);
, Pruébelo en línea! .Mathematica, 142 bytes
fuente
JavaScript (ES6), 79 bytes
Emite una lista para cada paso.
Tenga en cuenta que no necesitamos inicializar la matriz para que la bola ruede. Si no
x
está inicializado (no está definido), podemos usar los índices de la matriz (parámetroi
) para hacer el primer paso:Casos de prueba:
Mostrar fragmento de código
fuente
R,
1099594797462 bytesSi el hecho de que el código arroje advertencias sobre la solución real (sin advertencias si
n
es 1, 3 advertencias sin
es par yn
advertencias sin
es impar) no es un problema, entonces lo siguiente funciona de manera similar a la solución anterior, gracias al vector reciclaje:Pruébalo en línea!
Gracias de nuevo a @Giuseppe por 12 bytes adicionales de descuento.
Solución anterior sin advertencia a 94 bytes:
Pruébalo en línea!
Solución original a 109 bytes :
Pruébalo en línea!
fuente
print
devuelve su argumento para que podamos aprovecharlo aquí. No creo haberlo vistoencode
antes; ¡Esa es una buena manera de indexar!2
enembed
conmin(n,2)
?n
lugar del{}
ciclo while yan
que no hace nada. :)0:n+2*1:0
es lo mismo que1+0:n+c(1,-1)
para -4 bytes.any(print(...) != s)
es equivalente aany(print(...)-s)
para -1 byte. Y si podemos probar quem[1]==1
solo al final del algoritmo, entonces podemos descartarany
, para obtenerwhile(print(...)-1)
y eliminars
, para obtener 62 bytes,n=scan();m=1:n;w=0:n+2*1:0;while(print(m<-rev(m)[w[w<=n]])-1)n
Japt ,
20181512 bytesPruébelo (
-R
marque solo con fines de visualización)1 byte guardado gracias a ETHproductions.
fuente
w ò mw
puede serò2n)w
Casco , 9 bytes
Pruébalo en línea!
fuente
Ruby ,
64 57 5250 bytesPruébalo en línea!
Cómo funciona:
Primero cree el rango, luego repita la permutación x veces: use un índice negativo, pero voltee el último bit, para obtener la secuencia -2, -1, -4, -3 ... si x es par, esto terminará bueno, si no, agregaremos el elemento restante al final. Último paso: filtrar matrices repetidas (por lo que cubrimos todos los casos: x = 1, x = 2, números pares e impares)
fuente
Haskell,
7574 bytesPruébalo en línea!
g
los intercambios por pares,h
un solo paso (revertir + reordenar),!
se aplica repetidamenteh
(y recopila los resultados intermedios) hasta que se restablece el orden. Nota:!
toma el parámetro adicional adicional pero no utilizado0
solo para convertirlo en un operador infijo. La función principal lop
inicia.Editar: Gracias a @Angs por un byte.
fuente
0!x
en lugar def x
guardar un byte, ¡ pruébelo en línea!Java 8,
215214 bytesTraté de jugar golf usando matrices reales en lugar de una Lista, pero tanto la inversión como el intercambio ocuparán demasiados bytes. Tal vez se pueda combinar en un bucle (en lugar de invertir primero, luego intercambiar), pero aún no he resolver esto.
Sin embargo, esto definitivamente se puede jugar un poco más.
Explicación:
Pruébalo aquí.
fuente
Java (OpenJDK 8) ,
257245243226206205 bytesPruébalo en línea!
fuente
n->{java.util.Arrays x=null;int i=0,k,f,a[]=new int[n],t[]=new int[n];for(;i<n;a[i]=t[i]=++i);do{for(f=0;f<n/2;k=t[f],t[f]=t[n+~f],t[n+~f++]=k);for(k=1;k<n;t[k]=t[--k],t[k]=f,k+=3)f=t[k];System.out.println(x.toString(t));}while(!x.equals(a,t));}
( 245 bytes ) Resumen de cambiosjava.util.Arrays x=null;
:;n-f-1
an+~f
; se eliminaron los corchetes de bucle; Cambió 2xk-1
a--k
(y también cambiók+=2
ak+=3
neutralizar esto.,f
y reutilizandoi
.for(i=0;i<n/2;k=t[i],t[i]=t[n+~i],t[n+~i++]=k);
afor(i=0;i<n/2;t[i]=t[n+~i],t[n+~i++]=k)k=t[i];
MATL , 17 bytes
Pruébalo en línea!
Explicación
fuente
Stax , 17 bytes
Ejecutar y depurarlo
Explicación
Sorprendido, funciona tan rápido como lo hace, probado hasta 399 antes de que ya no quisiera templar mi navegador.
fuente
JavaScript (ES6), 122 bytes
r.push(a)
podría usarse en lugar der.push(b)
colocar la permutación original en el frente.fuente
Haskell , 97 bytes
Esto se siente un poco largo :(
Pruébalo en línea!
Explicación / Ungolfed
fuente
Apilado , 42 bytes
Pruébalo en línea!
Realiza la transformación dada usando el
periodsteps
incorporado. Sin embargo, este valor incorporado devuelve todos los elementos, que incluyen el rango de entrada como su primer y último elemento. Por lo tanto, decapitamos la lista, devolviendo todos menos el primer elemento.fuente
AWK , 123 bytes
No muy ajustado, pero esto es lo mejor que se me ocurrió.
Pruébalo en línea!
fuente
Python 2 ,
16515913881 bytesPruébalo en línea!
-20 bytes gracias a @ChasBrown . (Suspiro, hice un desafío completo sobre la sintaxis de corte extendido)
Whoa! GolfStorm (-57 bytes)! Gracias a Ian Gödel, tsh y Jonathan Frech.
fuente
list(reversed(a))
intentarloa[::-1]
.' '*[2-(x<3),x][x%2]
[b,0][b==a]
->b*(a!=b)
.JavaScript, 136 bytes
fuente