Une fonction est dite avoir un cycle de longueur n s'il existe un x dans son domaine tel que f n (x) = x et f m (x) ≠ x pour 0 <m <n , où l'exposant n désigne n - plier l'application de f . Notez qu'un cycle de longueur 1 est un point fixe f (x) = x .
Votre tâche consiste à implémenter une fonction bijective des entiers à eux-mêmes, qui a exactement un cycle de chaque longueur positive n . Une fonction bijective est une correspondance biunivoque, c'est-à-dire que chaque entier est mappé exactement une fois. Avoir exactement un cycle de longueur n signifie qu'il existe exactement n nombres distincts x pour lesquels f n (x) = x et f m (x) ≠ x pour 0 <m <n .
Voici un exemple de ce à quoi pourrait ressembler une telle fonction autour de x = 0 :
x ... -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 ...
f(x) ... 2 4 6 -3 -1 1 -4 0 -2 5 7 -7 -6 3 -5 ...
Cet extrait contient des cycles de longueur 1 à 5 :
n cycle
1 0
2 -2 1
3 -4 -3 -1
4 -5 6 3 7
5 -7 2 5 -6 4
...
Notez que ci-dessus, j'utilise "fonction" uniquement dans le sens mathématique. Vous pouvez écrire une fonction ou un programme complet dans la langue de votre choix, tant qu'il prend un seul entier (signé) en entrée et renvoie un seul entier (signé). Comme d'habitude, vous pouvez prendre une entrée via STDIN, un argument de ligne de commande, un argument de fonction, etc. et une sortie via STDOUT, une valeur de retour de fonction ou un argument de fonction (out), etc.
Bien sûr, de nombreux langages ne prennent pas (facilement) en charge les entiers de précision arbitraire. C'est bien si votre implémentation ne fonctionne que sur la plage du type d'entier natif de votre langue, tant que cela couvre au moins la plage [-127, 127] et qu'elle fonctionnerait pour des entiers arbitraires si le type d'entier du langage était remplacé par arbitraire- entiers de précision.
Les règles de code-golf standard s'appliquent.