Las tres "R": reversa, reordenar, repetir

31

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

  1. Invierte la matriz. Ahora nuestra matriz es

    [5, 4, 3, 2, 1]
    
  2. Reordenar (intercambiar) cada par. Nuestra lista tiene 2 pares: [5, 4]y [3, 2]. Desafortunadamente, no podemos agruparlos 1en un par, así que lo dejaremos solo. Después de intercambiar cada par, la nueva matriz es:

    [4, 5, 2, 3, 1]
    
  3. 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 , 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!

DJMcMayhem
fuente
66
¿Está bien generar el rango original en el frente?
HyperNeutrino
1
Creo que hay un error en la última línea del ejemplo. Debería ser 1 2 3 4 5, no 1 2 4 3 5.
Stewie Griffin
2
¿Alguien puede confirmar que el elemento 0 solo será 1 al comienzo y al final del proceso?
Roberto Graham
1
@RobertoGraham Tengo un script de Python que verifica que array[0]solo será 1 al inicio y al final del proceso n = 999. Al observar el patrón, parece que por cada n impar , el primer elemento sube 1, n-1, 3, n - 3, 5, n - 5, 7...hasta n - 2, 3, n, 1, que siempre tomará n pasos. No veo ninguna razón para que este patrón cambie con una n mayor .
DJMcMayhem
3
Si queremos demostrar que el período es n cuando n es impar, probablemente sea más fácil rastrear dónde va el elemento 1: sigue el camino 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 .
Misha Lavrov

Respuestas:

16

TI-Basic (serie 83), 58 57 54 bytes (104 caracteres)

:seq(I,I,1,Ans→A
:Ans→B
:Repeat prod(Ans=ᶫB
:ᶫB→C
:int(⁻Ans/2→D
:SortD(ᶫC,ᶫA
:SortD(ᶫD,ᶫA
:Pause ᶫA
:End

Explicación

Toma entrada Ans(por ejemplo, escribe 5:prgmNAMEpara usar listas de tamaño cinco).

Crea tres listas auxiliares del tamaño dado (que se recrean ᶫBen cada paso): ᶫB = ᶫC = {1,2,3,4,5,...}y ᶫD = {-1,-1,-2,-2,-3,...}. En cada paso, ordena ᶫCy ᶫDdesciende 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 la SortD(que reordena tantos elementos idénticos como sea posible. Cuando ᶫAes igual a ᶫBotra 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: Pausealmacena el valor al que está imprimiendo Ans, que es más corto de referencia que ᶫA.

-3 bytes: tomar entrada en Ans

Misha Lavrov
fuente
Truco impresionante con el tipo de selección!
Riking
7

Jalea , 10 bytes

RµUs2UFµÐĿ

Pruébalo en línea!

Explicación

RµUs2UFµÐĿ  Main link
R           Generate the range
        ÐĿ  While the results are unique (collecting results)
 µUs2UFµ    Reverse and reorder
  U         Reverse
   s        Slice non-overlapping into length
    2       2
     U      Reverse (automatically vectorizes to depth 1)
      F     Flatten

Nota

Si el rango original necesita estar al final, agregue ṙ1el código para 12 bytes.

Hiperneutrino
fuente
@DJMcMayhem ¡Genial, agradable!
HyperNeutrino
5

05AB1E , 13 11 bytes

LIGÂ2ôí˜})Ù

Pruébalo en línea!

Explicación

L             # range [1 ... input]
 IG           # input-1 times do:
   Â          # bifurcate
    2ô        # split into pieces of 2
      í       # reverse each
       ˜      # flatten
        }     # end loop
         )    # wrap stack in a list
          Ù   # remove duplicates
Emigna
fuente
4

JavaScript (ES6), 89 85

Editar 4 bytes guardados gracias @JustinMariner

Usando el hecho de que cuando cualquier elemento está en el lugar correcto, todos los elementos lo están.

n=>{for(l=[];n;l[n-1]=n--);while(alert(l=l.reverse().map((x,i)=>l[i^1]||x)),l[0]-1);}

Menos golf

n => {
  for(l=[], i=0; i<n; l[i] = ++i);
  while( alert(l=l.reverse().map( (x,i) => l[i^1] || x)),
         l[0]-1);
}

Prueba

var F=
n=>{for(l=[];n;l[n-1]=n--);while(alert(l=l.reverse().map((x,i)=>l[i^1]||x)),l[0]-1);}

alert=x=>console.log(x+'') // to avoid popup stress

function update() {
  F(+I.value);
} 

update()
<input type=number id=I value=1 min=1 oninput='update()'>

edc65
fuente
Creo que se puede acortar el bucle de gama de la capacidad para for(l=[];n;l[n-1]=n--);, Pruébelo en línea! .
Justin Mariner
@JustinMariner wow al revés, ¡genial! Gracias
edc65
3

Mathematica, 142 bytes

(h=Range@#;W={};For[i=1,i<=#,i++,s=Reverse@h;AppendTo[W,h=Join[f=Flatten[Reverse/@Partition[s,{2}]],s~Complement~f]];s=h];DeleteDuplicates@W)&
J42161217
fuente
3

JavaScript (ES6), 79 bytes

f=(n,a=[...Array(n)],b=a.map((x,i)=>n-((x?x-1:i)^1)||1))=>b[0]>1?b+`
`+f(n,b):b

Emite una lista para cada paso.

Tenga en cuenta que no necesitamos inicializar la matriz para que la bola ruede. Si no xestá inicializado (no está definido), podemos usar los índices de la matriz (parámetro i) para hacer el primer paso:

b=a.map((x,i)=>n-((x?x-1:i)^1)||1)

Casos de prueba:

Rick Hitchcock
fuente
3

R, 109 95 94 79 74 62 bytes

Si el hecho de que el código arroje advertencias sobre la solución real (sin advertencias si nes 1, 3 advertencias si nes par y nadvertencias si nes impar) no es un problema, entonces lo siguiente funciona de manera similar a la solución anterior, gracias al vector reciclaje:

n=scan();m=1:n;w=0:n+2*1:0;while(print(m<-rev(m)[w[w<=n]])-1)n

Pruébalo en línea!

Gracias de nuevo a @Giuseppe por 12 bytes adicionales de descuento.

Solución anterior sin advertencia a 94 bytes:

n=scan();m=s=1:n;while(any(print(m<-rev(m)[c(if(n>1)2:1+rep(seq(0,n-2,2),e=2),n[n%%2])])!=s))n

Pruébalo en línea!

Solución original a 109 bytes :

n=scan();m=s=1:n;repeat{cat(m<-rev(m)[c(t(embed(s,min(n,2))[!!s[-n]%%2,]),n[n%%2])],"\n");if(all(m==s))break}

Pruébalo en línea!

plannapus
fuente
1
88 bytes : printdevuelve su argumento para que podamos aprovecharlo aquí. No creo haberlo visto encodeantes; ¡Esa es una buena manera de indexar!
Giuseppe
¡Gracias! Aunque tendré que hacerlo un poco más largo ya que no funciona si n = 1 hasta ahora.
plannapus
Oh, no me di cuenta de que ... sustituir 2en embedcon min(n,2)?
Giuseppe
1
simplemente puede poner en nlugar del {}ciclo while ya nque no hace nada. :)
Giuseppe
1
Impresionante mejora !!! 0:n+2*1:0es lo mismo que 1+0:n+c(1,-1)para -4 bytes. any(print(...) != s)es equivalente a any(print(...)-s)para -1 byte. Y si podemos probar que m[1]==1solo al final del algoritmo, entonces podemos descartar any, para obtener while(print(...)-1)y eliminar s, 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
Giuseppe
3

Japt , 20 18 15 12 bytes

õ
£=ò2n)ÔcÃâ

Pruébelo ( -Rmarque solo con fines de visualización)

1 byte guardado gracias a ETHproductions.

               :Implicit input of integer U
õ              :Range [1,U]
\n             :Reassign to U
£              :Map
  ò            :  Partitions
   2           :    Of length 2
    n          :    Starting from the end
     )         :  End partition
      Ô        :  Reverse
       c       :  Flatten
 =             :  Reassign to U
        Ã      :End map
         â     :Deduplicate
Lanudo
fuente
A partir de este momento, creo que w ò mwpuede serò2n)w
ETHproductions
Oo, agradable, gracias, @ETHproductions. A punto de entrar en el pub, así que lo veré bien por la mañana '.
Shaggy
2

Casco , 9 bytes

U¡ȯṁ↔C2↔ḣ

Pruébalo en línea!

            -- implicit input N                 |  3
         ḣ  -- list [1..N]                      | [1,2,3]
 ¡(     )   -- iterate the following function,  | [[1,2,3],[2,3,1],[3,1,2],[1,2,3],...
U           -- until the first repetition:      | [[1,2,3],[2,3,1],[3,1,2]]
       ↔    --   reverse                        |   [3,2,1]
     C2     --   cut into two                   |   [[3,2],[1]]
   ṁ↔       --   reverse each pair & flatten    |   [2,3,1]
ბიმო
fuente
2

Ruby , 64 57 52 50 bytes

->x{(s=*w=1..x).map{s=w.map{|y|s[-y^1]||s[0]}}|[]}

Prué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)

GB
fuente
2

Haskell, 75 74 bytes

g(a:b:c)=b:a:g c
g x=x
h=g.reverse
0!x|x<[2]=[x]|1<2=x:0!h x
p n=0!h[1..n]

Pruébalo en línea!

glos intercambios por pares, hun solo paso (revertir + reordenar), !se aplica repetidamente h(y recopila los resultados intermedios) hasta que se restablece el orden. Nota: !toma el parámetro adicional adicional pero no utilizado 0solo para convertirlo en un operador infijo. La función principal lo pinicia.

Editar: Gracias a @Angs por un byte.

nimi
fuente
2
0!xen lugar de f xguardar un byte, ¡ pruébelo en línea!
Angs
1

Java 8, 215 214 bytes

import java.util.*;n->{Stack a=new Stack(),t;int i=0;for(;i<n;a.add(++i));t=(Stack)a.clone();Collections x=null;for(i=0;i<1|!a.equals(t);System.out.println(t))for(x.reverse(t),i=0;i<n;i++)if(i<n-1)x.swap(t,i,++i);}

Traté 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í.

import java.util.*;           // Required import for Stack and Collections

n->{                          // Method with integer parameter and no return-type
  Stack a=new Stack(),        //  Original List
        t;                    //  Copy-List
  int i=0;                    //  Index-integer, starting at 0
  for(;i<n;a.add(++i));       //  Fill the original list with the integers
  t=(Stack)a.clone();         //  Make a copy of the List
  Collections x=null;         //  Static `Collections` to reduce bytes
  for(i=0;                    //  Reset index `i` to 0
      i<1                     //  Loop (1) as long as `i` is 0 (the first iteration),
      |!a.equals(t);          //  or the input array is not equal to the copy
      System.out.println(t))  //    After every iteration: print the modified List
    for(x.reverse(t),         //   Reverse the copied List
        i=0;                  //   Reset `i` to 0
        i<n;                  //   Inner loop (2) over the List
        i++)                  //     After every iteration: increase `i` by 1 again
      if(i<n-1)               //    Unless it's the last item in the List:
        x.swap(t,i,++i);      //     Swap the items at indexes `i` and `i+1` 
                              //     (by increasing `i` by 1 first with `++i`)
                              //   End of inner loop (2) (implicit / single-line body)
                              //  End of loop (1) (implicit / single-line body)
}                             // End of method
Kevin Cruijssen
fuente
1

Java (OpenJDK 8) , 257 245 243 226 206 205 bytes

n->{int i=0,k,t[]=new int[n];while(i<n)t[i]=++i;do{for(i=0;i<n/2;t[i]=t[n+~i],t[n+~i++]=k)k=t[i];for(k=1;k<n;t[k]=t[--k],t[k]=i,k+=3)i=t[k];System.out.println(java.util.Arrays.toString(t));}while(t[0]>1);}

Pruébalo en línea!

Roberto Graham
fuente
1
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 cambios java.util.Arrays x=null;:; n-f-1a n+~f; se eliminaron los corchetes de bucle; Cambió 2x k-1a --k(y también cambió k+=2a k+=3neutralizar esto.
Kevin Cruijssen
Y puede guardar dos bytes más eliminando ,fy reutilizando i.
Kevin Cruijssen
¡Bien, lo has mejorado mucho! Ahora eres incluso más bajo que mi respuesta de Java. :) Puedes jugar al golf un byte más cambiando 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];
Kevin Cruijssen
1

MATL , 17 bytes

:`tP2ePXz!tG:-a]x

Pruébalo en línea!

Explicación

:       % Implicit input: n. Push [1 2 ... n]
`       % Do...while
  t     %   Duplicate
  P     %   Reverse
  2e    %   Reshape into a 2-row matrix. A final 0 is added if needed
  P     %   Reverse each column
  Xz    %   Nonzero entries (i.e. remove final 0 if present). Gives a column vector
  !     %   Transpose into a row
  t     %   Duplicate
  G:    %   Push [1 2 ... n] again
  -     %   Subtract element-wise
  a     %   Any. Gives true if there is at least a nonzero value
]       % End. Go to next iteration if top of the stack is true.  So the loop ends
        % when [1 2 ... n] has been found again
x       % Delete top of the stack (which is [1 2  ... n]). Implicit display
Luis Mendo
fuente
1

Stax , 17 bytes

âΩÄ─g╫B♥C╛♠ƒ?|πcD

Ejecutar y depurarlo

Explicación

RX~Wr2/{r+}Fc|uPcx=C      # Full program, unpacked, implicit input
RX~                       # Create range, save to X register, pop back to input stack
   W                      # Start while loop until truthy value
    r                     # reverse array
     2/                   # Split into groups of 2
      {r+}F               # Loop through each set and reverse each
           c              # Copy top value
            |u            # Convert to string representation of array
              P           # Pop top value off
               cx=        # Copy top value, get value of x register, compare to top value
                  C       # If top value is truthy, cancel block and end

Sorprendido, funciona tan rápido como lo hace, probado hasta 399 antes de que ya no quisiera templar mi navegador.

Multi
fuente
0

JavaScript (ES6), 122 bytes

f=(n,a=[...Array(n)].map((_,i)=>i+1),r=[],b=a.map((_,i)=>a[n+~(i^1)]||a[0]))=>b.some((e,i)=>e>b[i+1],r.push(b))?f(n,b,r):r

r.push(a)podría usarse en lugar de r.push(b)colocar la permutación original en el frente.

Neil
fuente
0

Haskell , 97 bytes

Esto se siente un poco largo :(

f n|x<-[1..n]=x:takeWhile(/=x)(tail$iterate((r=<<).g.r)x)
r=reverse
g[]=[]
g x=take 2x:g(drop 2x)

Pruébalo en línea!

Explicación / Ungolfed

-- starting with x, accumulate the results of repeatedly
-- applying the function permute
f n = x : takeWhile (/=x) (tail $ iterate permute x)
  where x = [1..n]
        -- reverse, cut2, reverse each pair & flatten
        permute = concatMap reverse . cut2 . reverse

-- recursively transform a list into groups of 2
cut2 [] = []
cut2 xs = take 2 xs : g (drop 2 xs)
ბიმო
fuente
0

Apilado , 42 bytes

[~>[rev 2#<$revflatmap]periodsteps behead]

Pruébalo en línea!

Realiza la transformación dada usando el periodstepsincorporado. 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.

Conor O'Brien
fuente
0

AWK , 123 bytes

No muy ajustado, pero esto es lo mejor que se me ocurrió.

{for(N=$1;N>$i=++i;);for(;n++<(i%2?i:i>2?2:1);){for(k=0;k++<i;)K[k]=(z=i-k+(k-1)%2*2)?$z:$1;for(k=0;k++<N;){$k=K[k]}print}}

Pruébalo en línea!

Robert Benson
fuente
0

Python 2 , 165 159 138 81 bytes

x=input()+1
b=a=range(1,x)
while b:b=[b[x-min(x,i+1^1)]for i in a];print b;b*=a<b

Prué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.

fireflame241
fuente
En lugar de list(reversed(a))intentarlo a[::-1].
Chas Brown
' '*[2-(x<3),x][x%2]
tsh
1
88 bytes
tsh
1
@tsh [b,0][b==a]-> b*(a!=b).
Jonathan Frech
0

JavaScript, 136 bytes

(n)=>{for(a=[],i=0;i<n;a[i]=++i);for(j=0;j<(n&1?n:2);j++){a.reverse();for(i=0;i<a.length-1;i += 2)m=a[i],a[i]=a[i+1],a[i+1]=m;alert(a)}}
tjespe
fuente