Można powiedzieć, że funkcja (lub program), która pobiera dane wejściowe i dostarcza dane wyjściowe, ma cykl, jeśli wielokrotne wywoływanie funkcji na swoim wyjściu ostatecznie osiągnie pierwotny numer. Na przykład weź następującą funkcję:
Input: n 1 2 3 4 5 6
Output: f(n) 5 7 1 3 4 9
Jeśli zaczniemy n=1
, f(n)=5
, f(f(n))=f(5)=4
, f(f(f(n)))=f(4)=3
, f(f(f(f(n))))=f(3)=1
.
To jest napisane (1 5 4 3)
. Ponieważ w tej pętli znajdują się 4 unikalne liczby, jest to cykl o długości 4.
Twoim zadaniem jest napisanie programu lub funkcji, która ma cykle o każdej możliwej długości. Oznacza to, że musi istnieć cykl o długości 1, o długości 2 i tak dalej.
Ponadto, twoja funkcja / program musi być od dodatnich liczb całkowitych do dodatnich liczb całkowitych i musi być bijectywny , co oznacza, że musi być dokładnie jedna wartość wejściowa dla każdej możliwej wartości wyjściowej, ponad wszystkimi liczbami całkowitymi dodatnimi. Innymi słowy, funkcja / program musi obliczyć permutację dodatnich liczb całkowitych.
Szczegóły: Dowolny standardowy system wejścia / wyjścia jest dozwolony, w tym STDIN, STDOUT, argument funkcji, return itp. Zabronione są standardowe luki.
Nie musisz martwić się o ograniczenia swoich typów danych - powyższe właściwości muszą posiadać tylko przy założeniu, że int
albo float
może posiadać dowolną wartość, na przykład.
Nie ma ograniczeń w zachowaniu funkcji na wejściach, które nie są dodatnimi liczbami całkowitymi, a te wejścia / wyjścia zostaną zignorowane.
Punktacja to golf w bajtach, wygrywa najkrótszy kod.