Escreva uma função que pegue um conjunto de números inteiros e imprima todas as permutações do conjunto, e a troca seja realizada entre cada etapa
Entrada
um conjunto de números inteiros, por exemplo (0, 1, 2)
Resultado
a lista de permutações e swaps no formato (conjunto) (swap) (conjunto) ...
Caso de teste
Input:
(3, 1, 5)
Output:
(3, 1, 5)
(3, 1)
(1, 3, 5)
(3, 5)
(1, 5, 3)
(1, 3)
(3, 5, 1)
(3, 5)
(5, 3, 1)
(3, 1)
(5, 1, 3)
Regras
- Você pode formatar o conjunto de números da maneira que desejar.
- Você pode fazer as trocas em qualquer ordem
- Você pode repetir permutações e swaps para obter um novo
- Seu código não precisa executar os swaps, a saída precisa apenas mostrar qual troca foi feita entre sua última saída e a atual
- Seu código precisa funcionar apenas para conjuntos com 2 ou mais elementos
- O conjunto fornecido não terá elementos repetitivos (por exemplo, (0, 1, 1, 2) é inválido)
Isso é código-golfe, então o código mais curto vence!
code-golf
math
permutations
Billyoyo
fonte
fonte
(3, 1, 4)
ou algo assim - lendo-o pela primeira vez, fiquei muito confuso porque a primeira troca0,1
trocou os elementos,0,1
mas também os índices0,1
, mas depois a próxima A troca não seguiu esse padrão. Também apontarei para o Sandbox, onde é possível postar desafios e obter feedback antes de publicá-los no site principal.Respostas:
Mathematica, 102 bytes
Exemplos
// Coluna para um resultado mais claro
fonte
Java,
449426 bytesAbordagem de força bruta. Ele continua fazendo trocas aleatórias até que todas as permutações possíveis tenham ocorrido. Ele usa um conjunto da representação de string da matriz para verificar quantos estados diferentes foram gerados. Para n números inteiros diferentes, existem n! = 1 * 2 * 3 * .. * n permutações distintas.
Atualizar
Ungolfed:
Uso:
Como você pode ver, existem muito mais swaps do que o mínimo necessário. Mas parece funcionar :-D
Como bônus, ele também funciona com strings, ou seja,
fonte
Set s=new HashSet();
. Seu código no métodon
pode ser um único retorno:static int n(int x){return x==1?1:x*n(x-1);}
. E você pode substituirString z
em seu métodoo
com um genérico em vez disso:static<T>void o(T z){System.out.println(z);s.add(z);}
. Tudo combinado reduziria a 426 bytes .JavaScript (ES6), 186 bytes
Nota: Não tenho certeza de quão flexível é o formato de saída; posso fazer isso por 171 bytes:
Funciona executando o algoritmo Steinhaus – Johnson – Trotter na matriz aleatória de índices e convertendo de volta para a matriz de entrada. Ungolfed:
fonte
Ruby, 86 bytes
fonte
Haskell - 135 bytes
resultado:
Estou usando a
permutations
função padrão , que não é baseada em swaps, por isso estou fazendo as permutações das permutações e encontrando uma que por acaso é uma cadeia de swaps.fonte