Inspirado por Retirado de uma pergunta no Stack Overflow .
O desafio
Dado um número inteiro n>1
, produza todas as matrizes que podem ser obtidas trocando exatamente duas entradas na matriz [1, 2, ..., n]
.
As matrizes podem ser produzidas em qualquer ordem.
Você pode usar consistentemente [0, 1, ..., n-1]
(com base em 0) em vez de [1, 2, ..., n]
(com base em 1).
Regras adicionais
Entrada e saída são flexíveis, como de costume .
Programas ou funções são permitidos, em qualquer linguagem de programação . As brechas padrão são proibidas.
O menor código em bytes vence.
Casos de teste
Entrada 2
fornece saída (assumida com base em 1)
2 1
Entrada 3
fornece saída (observe que as três matrizes podem estar em qualquer ordem)
1 3 2
2 1 3
3 2 1
Entrada 4
dá saída
1 2 4 3
1 3 2 4
1 4 3 2
2 1 3 4
3 2 1 4
4 2 3 1
Entrada 7
dá saída
1 2 3 4 5 7 6
1 2 3 4 6 5 7
1 2 3 4 7 6 5
1 2 3 5 4 6 7
1 2 3 6 5 4 7
1 2 3 7 5 6 4
1 2 4 3 5 6 7
1 2 5 4 3 6 7
1 2 6 4 5 3 7
1 2 7 4 5 6 3
1 3 2 4 5 6 7
1 4 3 2 5 6 7
1 5 3 4 2 6 7
1 6 3 4 5 2 7
1 7 3 4 5 6 2
2 1 3 4 5 6 7
3 2 1 4 5 6 7
4 2 3 1 5 6 7
5 2 3 4 1 6 7
6 2 3 4 5 1 7
7 2 3 4 5 6 1
code-golf
number
combinatorics
integer
Luis Mendo
fonte
fonte
[0 ... n-1]
vs[1 ... n]
! Eu sempre me sinto um pouco irritado quando tenho que usar um1+
porque J zero-indexes.Respostas:
Geléia ,
118 bytesExperimente online!
Como funciona
fonte
y
? Sempre foi um mistério para mim.[1,2],[4,3]y1,2,3
substitui cada 1 em [1, 2, 3] por 4 e cada 2 por 3 .R , 54 bytes
Experimente online!
Retorna uma matriz em que cada coluna é uma permutação.
combn(n,k)
gera todas as combinações de tamanhok
da listan
ou de1:n
sen
for um único inteiro. Opcionalmente, também é necessária uma funçãoFUN
a ser aplicada às combinações resultantes. Então, escrevemos uma função que executa a troca e retorna a lista trocada. Os resultados são todos acumulados em umarray
, que é neste caso bidimensional e, portanto, uma matriz.fonte
Python 2 , 71 bytes
Experimente online!
Usa esta dica .
fonte
Haskell , 62 bytes
Experimente online!
Eu só gerar a permutação, dada a
x
ey
para swap, para cadax,y
fonte
Python 2 , 72 bytes
Experimente online!
fonte
Wolfram Language (Mathematica) , 43 bytes
Experimente online!
Explicação:
Subsets[Range@#,{2}]
gera todos os subconjuntos de{1,2,...,n}
tamanho 2 e, para cada subconjunto,/.
alterna essas duas coisas na lista{1,2,...,n}
.Essa abordagem é decepcionantemente semelhante a muitos outros envios, mas aqui está um que é mais exclusivo do Mathematica, por 3 bytes extras:
Experimente online!
fonte
ReplaceList[Range@#,{a___,b_,c___,d_,e___}:>{a,d,c,b,e}]&
. Gosto da simplicidade (ou da codificação direta do problema), mas infelizmente a sintaxe de correspondência de padrões é tão detalhada que acaba sendo de 57 bytes.Haskell, 62 bytes
Experimente online!
fonte
Haskell , 71 bytes
Experimente online!
Isso adiciona o número atual ao final de todas as permutações de último e calcula todos os swaps que incluem o novo número.
fonte
MATL , 12 bytes
Experimente online!
fonte
:tY@wy=~!s2=Y)
. A mesma abordagem que a resposta de oitava de rahnema1, eu achoC, 93 bytes
Experimente online!
fonte
Oitava, 38 bytes
Experimente online!
Gera todas as permutações de 1: n e seleciona entre elas aquelas que possuem dois elementos diferentes de 1: n.
fonte
JavaScript (ES6), 81 bytes
Imprime matrizes indexadas em 0.
Demo
alert()
é substituído porconsole.log()
este trecho para facilitar a utilização.Mostrar snippet de código
fonte
Python 2 , 75 bytes
Experimente online!
fonte
Limpo ,
9082 bytesIsso pode ser feito em 80 bytes, mas se transforma em uma tradução direta das respostas de Haskell.
Experimente online!
fonte
05AB1E ,
159 bytesExperimente online!
Explicação
fonte
Casca , 9 bytes
Experimente online!
Explicação
fonte
Ruby ,
5553 bytesExperimente online!
Solução baseada em 0
O truque aqui é que o loop interno sempre "ignora" uma iteração: na primeira vez em que não é executado, apenas uma vez na segunda passagem e assim por diante.
Fiquei feliz com 55 bytes até ver que R podia ser reduzido a 54, então tive que chegar a 53.
fonte
Python 2 , 90 bytes
Experimente online!
fonte
Pitão, 9 bytes
Demonstração
A maneira mais fácil de trocar dois valores é usar
.r
, que é a função de translação rotativa de Pyth..r<list>[A, B]
trocará todas as ocorrências deA
eB
dentrolist
.Portanto, aplicando a função de tradução a
UQ
, a lista de0
paran-1
com cada lista de dois elementos de números diferentes na lista, geraremos a saída desejada.Q
é a entrada,n
eU
é a função de alcance.A maneira mais fácil de fazer isso seria:
.cUQ2
gera todas as 2 combinações de elementos distintos no intervalo e.rLUQ
mapeia a.r
função sobre eles e a listaUQ
.No entanto, isso seria 10 bytes.
Em vez de fazer
.cUQ2
, os pares ordenados distintos, podemos fazer todos os pares*=U
. Isso é implicitamente equivalente a*=UQQ
. Começa sobrescrevendoQ
comUQ
, e depois levando o produto cartesiano deUQ
eUQ
. Isso fornece todos os pares de números no intervalo, não necessariamente ordenados ou distintos..rLQ
swaps usando cada lista. Lembre-se de queQ
agora é igual à lista de0
paran-1
, nãon
.Como os pares não foram encomendados, existem duplicatas.
{
remove duplicatas. Como os pares não eram distintos, a lista inalterada está presente. Essa lista sempre será a primeira após a desduplicação, pois{
preserva a ordem da primeira aparição e a lista inalterada é produzida pela rotação por[0,0]
.t
remove o primeiro elemento, fornecendo a lista desejada de trocas.fonte
Pitão, 11 bytes
Experimente online
Não é tão curto quanto a abordagem de isaacg, mas diferente o suficiente para postar.
Explicação
fonte
Java 8,
109105 bytesEstou enferrujado. Não tenho jogado código em meses. Acabei portando a resposta C do @Steadybox . Provavelmente, posso jogar mais.
Experimente aqui.
fonte
Ruby , 66 bytes
Experimente online!
fonte
Rubi , 80 bytes
-12 bytes graças ao Unihedron.
Experimente online!
Eu tinha uma abordagem em mente que era melhor traduzida para Ruby por algum motivo, então ... eu realmente nem conheço Ruby ...
fonte
1..n
a uma variável one-char e reutilizá-la (instruções separadas com nova linha ou ponto e vírgula), 2. sem colchetes nas instruções termary:i==x ?y:i==y ?x:i
(observe onde eu tenho espaços para separar o shebang em potencial ) e 3. emuniq[1,n]
vez deuniq[1..-1]
.