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
Inverta a matriz. Agora nossa matriz é
[5, 4, 3, 2, 1]
Reordene (troque) cada par. Nossa lista possui 2 pares:,
[5, 4]
e[3, 2]
. Infelizmente, não podemos agrupar o1
par em um par, então vamos deixar por conta própria. Depois de trocar cada par, a nova matriz é:[4, 5, 2, 3, 1]
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 código de golfe , 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!
fonte
1 2 3 4 5
, não1 2 4 3 5
.array[0]
somente 1 será no início e no final do processon = 999
. Observando o padrão, parece que para cada n ímpar , o primeiro elemento sobe1, 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 .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 .Respostas:
TI-Basic (série 83),
585754 bytes (104 caracteres)Explicação
Recebe entrada
Ans
(por exemplo, escreva5:prgmNAME
para usar listas de tamanho cinco).Cria três listas auxiliares do tamanho especificado (que são recriadas
ᶫB
em cada etapa):ᶫB = ᶫC = {1,2,3,4,5,...}
eᶫD = {-1,-1,-2,-2,-3,...}
. Em cada etapa, classificaᶫC
eᶫD
em ordem decrescente, aplicando a mesma permutação aᶫA
. No caso deᶫC
, isso reverteᶫA
e, 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 aSortD(
qual reordena o maior número possível de elementos idênticos. QuandoᶫA
é igual aᶫB
novamente, 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:
Pause
armazena o valor para oAns
qual está imprimindo , que é mais curto do que referênciaᶫA
.-3 bytes: recebe entrada
Ans
fonte
Gelatina , 10 bytes
Experimente online!
Explicação
Nota
Se o intervalo original precisar estar no final, acrescente
ṙ1
ao código 12 bytes.fonte
05AB1E ,
1311 bytesExperimente online!
Explicação
fonte
JavaScript (ES6),
8985Editar 4 bytes salvos thx @JustinMariner
Usando o fato de que, quando qualquer elemento está no lugar certo, todos os elementos estão.
Menos golfe
Teste
fonte
for(l=[];n;l[n-1]=n--);
, Experimente on-line! .Mathematica, 142 bytes
fonte
JavaScript (ES6), 79 bytes
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âmetroi
) para executar o primeiro passo:Casos de teste:
Mostrar snippet de código
fonte
R,
1099594797462 bytesSe o fato de o código lançar avisos sobre a solução real (nenhum aviso se
n
for 1, 3 avisos sen
for par en
avisos sen
for ímpar) não for um problema, o seguinte funcionará da mesma forma que a solução anterior, graças ao vetor reciclando:Experimente online!
Agradecemos novamente a @ Giuseppe por mais 12 bytes de desconto!
Solução anterior sem aviso a 94 bytes:
Experimente online!
Solução original em 109 bytes :
Experimente online!
fonte
print
retorna seu argumento para que possamos tirar proveito dele aqui. Acho que nunca tinha vistoencode
antes; essa é uma maneira elegante de indexar!2
noembed
commin(n,2)
?n
vez do{}
loop while, ján
que não faz nada. :)0:n+2*1:0
é o mesmo que1+0:n+c(1,-1)
para -4 bytes.any(print(...) != s)
é equivalente aany(print(...)-s)
-1 byte. Aaand se pudermos provar quem[1]==1
somente no final do algoritmo, então podemos deixar cair oany
, então temoswhile(print(...)-1)
e podemos removers
, 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
Japt ,
20181512 bytesExperimente (
-R
sinalize apenas para fins de visualização)1 byte economizado graças à ETHproductions.
fonte
w ò mw
pode serò2n)w
Casca , 9 bytes
Experimente online!
fonte
Ruby ,
64 57 5250 bytesExperimente 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)
fonte
Haskell,
7574 bytesExperimente online!
g
as trocas entre pares,h
uma única etapa (reverso + reordenar),!
se aplicam repetidamenteh
(e coletam os resultados intermediários) até que a ordem seja restaurada. Nota:!
aceita o parâmetro extra adicional, mas não utilizado,0
apenas para torná-lo um operador infix. A função principalp
inicia.Edit: Obrigado a @Angs por um byte.
fonte
0!x
em vez def x
salvar um byte - Experimente online!Java 8,
215214 bytesTentei 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.
fonte
Java (OpenJDK 8) ,
257245243226206205 bytesExperimente online!
fonte
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çõesjava.util.Arrays x=null;
:;n-f-1
paran+~f
; suportes de laço removidos; Alterou 2xk-1
para--k
(e também mudouk+=2
parak+=3
para neutralizar isso.,f
e reutilizandoi
.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];
MATL , 17 bytes
Experimente online!
Explicação
fonte
Stax , 17 bytes
Execute e depure
Explicação
Surpreendido, ele funciona tão rápido quanto, testado até 399 antes que eu não quisesse mais usar o meu navegador temporário.
fonte
JavaScript (ES6), 122 bytes
r.push(a)
poderia ser usado em vez der.push(b)
colocar a permutação original na frente.fonte
Haskell , 97 bytes
Parece um pouco longo :(
Experimente online!
Explicação / Ungolfed
fonte
Empilhados , 42 bytes
Experimente online!
Executa a transformação fornecida usando o
periodsteps
builtin. 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.fonte
AWK , 123 bytes
Não é muito apertado, mas é o melhor que eu poderia fazer.
Experimente online!
fonte
Python 2 ,
16515913881 bytesExperimente 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.
fonte
list(reversed(a))
tentara[::-1]
.' '*[2-(x<3),x][x%2]
[b,0][b==a]
->b*(a!=b)
.JavaScript, 136 bytes
fonte