Rozważ permutację liczb całkowitych 1
... n
, takich jak ta dla n = 6
:
[5,2,4,3,6,1]
Jeśli zobaczysz permutację jako odwzorowanie od [1,2,3,4,5,6]
do [5,2,4,3,6,1]
, permutację można rozłożyć na rozłączne cykle . Cykl jest podzbiorem elementów odwzorowujących się względem siebie. Na przykład 1
zostanie zamapowany na 5
, który zostanie zmapowany 6
, na który zostanie odwzorowany z powrotem 1
. Tak więc jest jeden cykl [1,5,6]
. Pozostałe cykle to [2]
i [3,4]
. Zatem liczba cykli dla tej permutacji wynosi 3
.
Zasadniczo cykle permutacji są unikalne (do kolejności), a liczba cykli permutacji wielkości n
jest różna od 1
do n
.
Wyzwanie
Biorąc pod uwagę niepustą permutację, wypisz jej liczbę cykli.
Wejście jest tablica utworzona przez n
liczby całkowite 1
, 2
, ..., n
, gdzie n > 0
. Każda liczba całkowita występuje dokładnie raz. Kolejność, w jakiej się pojawiają, określa permutację, jak w powyższym przykładzie.
Zamiast tablicy możesz użyć listy, łańcucha z separatorem między liczbami, osobnego wejścia dla każdej liczby lub wszystkiego, co jest rozsądne.
Aby uzyskać permutację rozmiaru n
, zamiast 1-liczbowego zestawu liczb całkowitych 1
... n
możesz konsekwentnie używać zestawu 0-liczbowego 0
, ..., n-1
. Jeśli tak, proszę wskazać to w odpowiedzi.
Kod powinien działać n
nawet 20
w rozsądnym czasie, powiedzmy krócej niż minutę.
Kod golfa. Wszystkie wbudowane dozwolone.
Przypadki testowe
Zakłada się, że dane wejściowe z tablicy 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
Związane z
To powiązane wyzwanie wymaga rzeczywistych cykli permutacji, a nie ich liczby. Wymaganie tylko liczby cykli może prowadzić do krótszych algorytmów, które omijają generowanie faktycznych cykli.
1
, ..., n
w tej kolejności. Czy możesz wyjaśnić, w jaki sposób mapowanie może być wkładem? Czy to struktura danych?
dict
. Chcę mieć {1: 2, 2: 1}
jako dane wejściowe zamiast [2, 1]
.