Si può dire che una funzione (o programma) che accetta input e fornisce output abbia un ciclo se chiamare la funzione sul proprio output alla fine raggiunge ripetutamente il numero originale. Ad esempio, prendi la seguente funzione:
Input: n 1 2 3 4 5 6
Output: f(n) 5 7 1 3 4 9
Se cominciamo con 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
.
Questo è scritto (1 5 4 3)
. Poiché ci sono 4 numeri univoci in questo ciclo, questo è un ciclo di lunghezza 4.
La tua sfida è scrivere un programma o una funzione che abbia cicli di ogni possibile lunghezza. Cioè, ci deve essere un ciclo di lunghezza 1, di lunghezza 2 e così via.
Inoltre, la tua funzione / programma deve essere dagli interi positivi agli interi positivi e deve essere biiettiva , il che significa che deve esserci esattamente un valore di input per ogni possibile valore di output, su tutti i numeri interi positivi. Per dirla in altro modo, la funzione / programma deve calcolare una permutaione degli interi positivi.
Dettagli: è consentito qualsiasi sistema di input / output standard, inclusi STDIN, STDOUT, argomento della funzione, ritorno, ecc. Sono vietate le scappatoie standard.
Non è necessario preoccuparsi delle limitazioni dei tipi di dati: le proprietà sopra riportate devono essere valide solo supponendo che un int
o float
possa contenere qualsiasi valore, ad esempio.
Non ci sono restrizioni sul comportamento della funzione sugli ingressi che non sono numeri interi positivi e tali ingressi / uscite verranno ignorati.
Il punteggio è il golf del codice in byte, il codice più corto vince.