Considere uma permutação de números inteiros 1
, ... n
,, como esta para n = 6
:
[5,2,4,3,6,1]
Se você visualizar a permutação como um mapeamento de [1,2,3,4,5,6]
para [5,2,4,3,6,1]
, a permutação poderá ser descompactada em ciclos separados . Um ciclo é um subconjunto de elementos que são mapeados entre si. Por exemplo, 1
é mapeado para 5
, que é mapeado para 6
, para o qual é mapeado novamente 1
. Então, um ciclo é [1,5,6]
. Os outros ciclos são [2]
e [3,4]
. Assim, o número de ciclos para esta permutação é 3
.
Em geral, os ciclos de uma permutação são únicos (por ordem), e o número de ciclos para uma permutação de tamanho n
varia de 1
a n
.
O desafio
Dada uma permutação não vazia, produza seu número de ciclos.
A entrada é um conjunto formado pelos n
números inteiros 1
, 2
, ..., n
, onde n > 0
. Cada número inteiro ocorre exatamente uma vez. A ordem em que eles aparecem define a permutação, como no exemplo acima.
Em vez de uma matriz, você pode usar uma lista, uma sequência com um separador entre os números, uma entrada separada para cada número ou qualquer coisa que seja razoável.
Para uma permutação de tamanho n
, em vez do conjunto de números inteiros baseado em 1 1
, ..., n
você pode usar consistentemente o conjunto baseado em 0 0
, ..., n-1
. Nesse caso, indique-o na sua resposta.
O código deve funcionar por n
até 20
um tempo razoável, digamos menos de um minuto.
Código de golfe. Todos os builtins permitidos.
Casos de teste
Isso pressupõe entrada de matriz baseada em 1.
[1] -> 1
[3,2,1] -> 2
[2,3,4,5,1] -> 1
[5,2,4,3,6,1] -> 3
[8,6,4,5,2,1,7,3] -> 2
[4,5,11,12,7,1,3,9,10,6,8,2] -> 1
[4,2,5,11,12,7,1,3,9,10,6,8] -> 5
[5,8,6,18,16,9,14,10,11,12,4,20,15,19,2,17,1,13,7,3] -> 3
[14,5,17,15,10,18,1,3,4,13,11,16,2,12,9,7,20,6,19,8] -> 7
Relacionado
Esse desafio relacionado pede os ciclos reais da permutação, não o número deles. Exigir apenas o número de ciclos pode levar a algoritmos mais curtos que evitam a geração dos ciclos reais.
1
, ..., n
nessa ordem. Você pode esclarecer como um mapeamento pode ser uma entrada? É uma estrutura de dados?
dict
. Eu quero ter {1: 2, 2: 1}
como uma entrada em vez de [2, 1]
.