Considere una permutación de los enteros 1
, ..., n
como este para n = 6
:
[5,2,4,3,6,1]
Si ve la permutación como un mapeo de [1,2,3,4,5,6]
a [5,2,4,3,6,1]
, la permutación puede descomponerse en ciclos disjuntos . Un ciclo es un subconjunto de elementos que se asignan entre sí. Por ejemplo, 1
se asigna a 5
, que se asigna a 6
, que se vuelve a asignar 1
. Entonces un ciclo es [1,5,6]
. Los otros ciclos son [2]
y [3,4]
. Por lo tanto, el número de ciclos para esta permutación es 3
.
En general, los ciclos de una permutación son únicos (hasta el orden), y el número de ciclos para una permutación de tamaño n
varía de 1
a n
.
El reto
Dada una permutación no vacía, genera su número de ciclos.
De entrada es una matriz formada por los n
números enteros 1
, 2
, ..., n
, donde n > 0
. Cada número entero ocurre exactamente una vez. El orden en que aparecen define la permutación, como en el ejemplo anterior.
En lugar de una matriz, puede usar una lista, una cadena con un separador entre los números, una entrada separada para cada número o cualquier cosa que sea razonable.
Para una permutación de tamaño n
, en lugar del conjunto de enteros basado en 1 1
, ..., n
puede usar consistentemente el conjunto basado en 0 0
, ..., n-1
. Si es así, indíquelo en su respuesta.
El código debería funcionar n
hasta 20
en un tiempo razonable, digamos menos de un minuto.
Código de golf. Todas las construcciones permitidas.
Casos de prueba
Esto supone una entrada de matriz basada en 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
Este desafío relacionado pide los ciclos reales de la permutación, no el número de ellos. Requerir solo el número de ciclos puede conducir a algoritmos más cortos que eluden la generación de los ciclos reales.
1
, ..., n
en ese orden. ¿Puedes aclarar cómo puede un mapeo ser una entrada? ¿Es una estructura de datos?
dict
. Quiero tener {1: 2, 2: 1}
como entrada en lugar de [2, 1]
.