Os três R: inverter, reordenar, repetir

31

Enquanto rabiscava com números, encontrei uma permutação interessante que você pode gerar a partir de uma lista de números. Se você repetir a mesma permutação várias vezes, sempre retornará à matriz original. Vamos usar a seguinte lista:

[1, 2, 3, 4, 5]

como um exemplo

  1. Inverta a matriz. Agora nossa matriz é

    [5, 4, 3, 2, 1]
    
  2. Reordene (troque) cada par. Nossa lista possui 2 pares:, [5, 4]e [3, 2]. Infelizmente, não podemos agrupar o 1par em um par, então vamos deixar por conta própria. Depois de trocar cada par, a nova matriz é:

    [4, 5, 2, 3, 1]
    
  3. Repita as etapas 1 e 2 até retornarmos à matriz original. Aqui estão os próximos 4 passos:

    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
    

    Se o comprimento da lista, n for ímpar, sempre serão necessárias exatamente n etapas para retornar à matriz original. Se n for par, sempre serão necessárias duas etapas para retornar à matriz original, a menos que n seja 2; nesse caso, será executada uma etapa (porque reverter e trocar é a mesma coisa).

Sua tarefa para hoje (se você optar por aceitá-la) é visualizar esse conjunto de etapas para listas de comprimentos arbitrários. Você deve escrever um programa ou função que use um único número inteiro positivo n como entrada e execute este conjunto de etapas para a lista [1, n]. Você deve imprimir cada etapa intermediária ao longo do caminho, se isso significa imprimir cada etapa ou retornar todas elas como uma lista de etapas. Não sou muito exigente quanto ao formato de saída, desde que fique claro que você está gerando todas as etapas. Isso significa (por exemplo) qualquer um destes:

  • Saída de cada etapa como uma lista para STDOUT

  • Retornando uma lista de listas

  • Retornando uma lista de representações de string de cada etapa

  • Retornando / produzindo uma matriz

seria aceitável.

Você também deve produzir a matriz original, seja ela final ou no início. (tecnicamente, ambos estão corretos)

Você precisará lidar com o case de borda 2 dando 1 etapa em vez de 2 , portanto, verifique se a solução funciona com uma entrada de 2 (e 1 é outro case de borda em potencial).

Como de costume, esse é um , então as brechas padrão se aplicam e tente reduzir sua solução mais do que qualquer outra no idioma de sua escolha (ou tente derrotar outro idioma que normalmente é mais curto que o seu, se você estiver se sentindo bem. para um desafio).

Teste de E / S

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]

E, para uma boa medida, aqui está um caso de teste 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]

Divirta-se jogando golfe!

DJMcMayhem
fonte
6
É bom gerar a faixa original na frente?
HyperNeutrino
1
Eu acho que há um erro na última linha do exemplo. Deveria ser 1 2 3 4 5, não 1 2 4 3 5.
Stewie Griffin
2
Alguém pode confirmar que o elemento 0 só será 1 no início e no final do processo?
Roberto Graham
1
@RobertoGraham Eu tenho um script python que verifica que array[0]somente 1 será no início e no final do processo n = 999. Observando o padrão, parece que para cada n ímpar , o primeiro elemento sobe 1, n-1, 3, n - 3, 5, n - 5, 7...até n - 2, 3, n, 1, o que sempre leva n passos. Não vejo nenhuma razão para que esse padrão mude com um n maior .
DJMcMayhem
3
Se queremos provar que o período é n quando n é ímpar, provavelmente é mais fácil rastrear aonde o elemento 1 vai: segue o caminho 1, n, 2, n-2, 4, n-4, 6, n-6, 8, n-8, ...e é fácil mostrar por indução que um elemento na posição par x se move para nx após um passo , e um elemento na posição ímpar x se move para n-x + 2 . Portanto, se n = 2k + 1 , depois do 2k -ésimo passo 1 estará em 2k , e no próximo passo em n-2k = 1 .
Misha Lavrov

Respostas:

16

TI-Basic (série 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

Explicação

Recebe entrada Ans(por exemplo, escreva 5:prgmNAMEpara usar listas de tamanho cinco).

Cria três listas auxiliares do tamanho especificado (que são recriadas ᶫBem cada etapa): ᶫB = ᶫC = {1,2,3,4,5,...}e ᶫD = {-1,-1,-2,-2,-3,...}. Em cada etapa, classifica ᶫCe ᶫDem ordem decrescente, aplicando a mesma permutação a ᶫA. No caso de ᶫC, isso reverte ᶫAe, no caso de ᶫD, isso troca pares adjacentes porque o TI-Basic usa uma implementação de classificação de seleção realmente estúpida, para a SortD(qual reordena o maior número possível de elementos idênticos. Quando ᶫAé igual a ᶫBnovamente, paramos.

Não, sério, o algoritmo de classificação interno é minha segunda maior reclamação com o intérprete TI-Basic. (Minha maior reclamação é como muitos loops aninhados diminuem a velocidade do intérprete, pois os dados do loop são armazenados em uma pilha, mas a pilha cresce do lado errado, então a calculadora precisa mover a pilha inteira toda vez que um elemento é pressionado ou estalou.) Mas desta vez, é conveniente.


-1 byte: Pausearmazena o valor para o Ansqual está imprimindo , que é mais curto do que referência ᶫA.

-3 bytes: recebe entrada Ans

Misha Lavrov
fonte
Truque impressionante com o tipo de seleção!
Riking 28/09
7

Gelatina , 10 bytes

RµUs2UFµÐĿ

Experimente online!

Explicação

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

Se o intervalo original precisar estar no final, acrescente ṙ1ao código 12 bytes.

HyperNeutrino
fonte
@DJMcMayhem Cool, nice!
HyperNeutrino 29/09
5

05AB1E , 13 11 bytes

LIGÂ2ôí˜})Ù

Experimente online!

Explicação

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
fonte
4

JavaScript (ES6), 89 85

Editar 4 bytes salvos thx @JustinMariner

Usando o fato de que, quando qualquer elemento está no lugar certo, todos os elementos estão.

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

Menos golfe

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);
}

Teste

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
fonte
Eu acho que você pode reduzir o ciclo de criação de alcance para for(l=[];n;l[n-1]=n--);, Experimente on-line! .
Justin Mariner
@JustinMariner uau para trás, ótimo! Graças
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
fonte
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

Produz uma lista para cada etapa.

Observe que não precisamos inicializar o array para fazer a bola rolar. Se não inicializado ( xé indefinido), podemos usar os índices da matriz (parâmetro i) para executar o primeiro passo:

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

Casos de teste:

Rick Hitchcock
fonte
3

R, 109 95 94 79 74 62 bytes

Se o fato de o código lançar avisos sobre a solução real (nenhum aviso se nfor 1, 3 avisos se nfor par e navisos se nfor ímpar) não for um problema, o seguinte funcionará da mesma forma que a solução anterior, graças ao vetor reciclando:

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

Experimente online!

Agradecemos novamente a @ Giuseppe por mais 12 bytes de desconto!

Solução anterior sem aviso 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

Experimente online!

Solução original em 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}

Experimente online!

plannapus
fonte
1
88 bytes - printretorna seu argumento para que possamos tirar proveito dele aqui. Acho que nunca tinha visto encodeantes; essa é uma maneira elegante de indexar!
Giuseppe
Obrigado! Embora eu precise torná-lo um pouco mais longo, pois não funciona se n = 1 até agora.
plannapus
Oh, eu não percebi que ... substituir 2no embedcom min(n,2)?
Giuseppe
1
você pode simplesmente colocar em nvez do {}loop while, já nque não faz nada. :)
Giuseppe
1
Melhoria impressionante !!! 0:n+2*1:0é o mesmo que 1+0:n+c(1,-1)para -4 bytes. any(print(...) != s)é equivalente a any(print(...)-s)-1 byte. Aaand se pudermos provar que m[1]==1somente no final do algoritmo, então podemos deixar cair o any, então temos while(print(...)-1)e podemos remover s, então temos 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Ãâ

Experimente ( -Rsinalize apenas para fins de visualização)

1 byte economizado graças à 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
Shaggy
fonte
A partir de agora, eu acredito que w ò mwpode serò2n)w
ETHproductions
Bom, obrigado, @ETHproductions. Estou prestes a entrar no pub, então vou dar uma boa olhada nisso de manhã.
Shaggy
2

Casca , 9 bytes

U¡ȯṁ↔C2↔ḣ

Experimente online!

            -- 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]
ბიმო
fonte
2

Ruby , 64 57 52 50 bytes

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

Experimente online!

Como funciona:

Primeiro crie o intervalo, depois repita a permutação x vezes: use um índice negativo, mas gire o último bit, para obter a sequência -2, -1, -4, -3 ... se x for par, isso terminará bem, se não, adicionaremos o elemento restante no final. Última etapa: filtrar matrizes repetidas (para cobrir todos os casos: x = 1, x = 2, números ímpares e pares)

GB
fonte
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]

Experimente online!

gas trocas entre pares, huma única etapa (reverso + reordenar), !se aplicam repetidamente h(e coletam os resultados intermediários) até que a ordem seja restaurada. Nota: !aceita o parâmetro extra adicional, mas não utilizado, 0apenas para torná-lo um operador infix. A função principal pinicia.

Edit: Obrigado a @Angs por um byte.

nimi
fonte
2
0!xem vez de f xsalvar um byte - Experimente online!
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);}

Tentei jogar golfe usando matrizes reais em vez de uma lista, mas a reversão e a troca ocupam muitos bytes. Talvez ele possa ser combinado em um loop (em vez de primeiro reverter e depois trocar), mas ainda não descobrir isso.
Definitivamente, isso pode ser jogado um pouco mais.

Explicação:

Experimente aqui.

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
fonte
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);}

Experimente online!

Roberto Graham
fonte
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 ) Resumo das alterações java.util.Arrays x=null;:; n-f-1para n+~f; suportes de laço removidos; Alterou 2x k-1para --k(e também mudou k+=2para k+=3para neutralizar isso.
Kevin Cruijssen
E você pode salvar mais dois bytes removendo ,fe reutilizando i.
Kevin Cruijssen
Bom, você melhorou muito! Agora você é ainda mais baixo que a minha resposta Java. :) Você pode jogar mais um byte ao mudar for(i=0;i<n/2;k=t[i],t[i]=t[n+~i],t[n+~i++]=k);parafor(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

Experimente online!

Explicação

:       % 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
fonte
1

Stax , 17 bytes

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

Execute e depure

Explicação

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

Surpreendido, ele funciona tão rápido quanto, testado até 399 antes que eu não quisesse mais usar o meu navegador temporário.

Multi
fonte
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)poderia ser usado em vez de r.push(b)colocar a permutação original na frente.

Neil
fonte
0

Haskell , 97 bytes

Parece um pouco longo :(

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

Experimente online!

Explicação / 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)
ბიმო
fonte
0

Empilhados , 42 bytes

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

Experimente online!

Executa a transformação fornecida usando o periodstepsbuiltin. No entanto, esse built-in retorna todos os elementos, o que inclui o intervalo da entrada como seu primeiro e último elementos. Portanto, decapitamos a lista, retornando todos, exceto o primeiro elemento.

Conor O'Brien
fonte
0

AWK , 123 bytes

Não é muito apertado, mas é o melhor que eu poderia fazer.

{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}}

Experimente online!

Robert Benson
fonte
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

Experimente online!

-20 bytes graças a @ChasBrown . (Suspiro, fiz um grande desafio sobre a sintaxe de fatias estendida)

Uau! GolfStorm (-57 bytes)! Agradecimentos a Ian Gödel, tsh e Jonathan Frech.

fireflame241
fonte
Em vez de list(reversed(a))tentar 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
fonte