Une fonction (ou un programme) qui prend des entrées et fournit des sorties peut être considérée comme ayant un cycle si l'appel de la fonction sur sa propre sortie à plusieurs reprises atteint finalement le numéro d'origine. Par exemple, prenez la fonction suivante:
Input: n 1 2 3 4 5 6
Output: f(n) 5 7 1 3 4 9
Si nous commençons par 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
.
C'est écrit (1 5 4 3)
. Puisqu'il y a 4 nombres uniques dans cette boucle, c'est un cycle de longueur 4.
Votre défi est d'écrire un programme ou une fonction qui a des cycles de toutes les longueurs possibles. Autrement dit, il doit y avoir un cycle de longueur 1, de longueur 2, etc.
De plus, votre fonction / programme doit aller des entiers positifs aux entiers positifs, et il doit être bijectif , ce qui signifie qu'il doit y avoir exactement une valeur d'entrée pour chaque valeur de sortie possible, sur tous les entiers positifs. En d'autres termes, la fonction / programme doit calculer une permutation des entiers positifs.
Détails: Tout système d'entrée / sortie standard est autorisé, y compris STDIN, STDOUT, argument de fonction, retour, etc. Les failles standard sont interdites.
Vous n'avez pas à vous soucier des limites de vos types de données - les propriétés ci-dessus ne doivent être conservées qu'en supposant qu'une int
ou float
peut contenir n'importe quelle valeur, par exemple.
Il n'y a aucune restriction sur le comportement de la fonction sur les entrées qui ne sont pas des entiers positifs, et ces entrées / sorties seront ignorées.
La notation est le golf de code en octets, le code le plus court gagne.
la source
Réponses:
Pyth,
118 octetsBeaucoup plus ennuyeux que ma réponse précédente.
Chaque numéro contenant un chiffre à 0 correspond à lui-même. Tout autre numéro correspond au numéro dont les chiffres tournent de 1. Ainsi, par exemple:
la source
Python 2,
565554 octetsVoici les 21 premières sorties:
Le modèle est évident si nous divisons la liste en morceaux comme ceci:
la source
Pyth, 25 octets
Il s'agit de la même séquence que @ Sp3000, mais avec un formulaire fermé. Le formulaire fermé est:
la source
Python3, 40 octets
Chaque numéro contenant un chiffre à 0 correspond à lui-même. Tout autre numéro correspond au numéro dont les chiffres tournent de 1. Ainsi, par exemple:
la source
Rubis, 22 + 1 = 23
Avec l'indicateur de ligne de commande
-p
, exécutezLorsqu'il est donné en entrée une représentation sous forme de chaîne d'un nombre (sans retour à la ligne), il maintient le premier chiffre constant, puis fait pivoter le reste à gauche, ainsi
1234
devient1342
.Cela peut être réduit à 21 caractères avec
$_=$1+$'+$2if/(.)(.)/
, mais affiche un avertissement.la source
Rubis, 16 + 1 = 17
Avec l'indicateur de ligne de commande
-p
, exécutezC'est une fonction plus compliquée que mon autre réponse, mais s'avère plus jouable au golf (et tolérante aux nouvelles lignes). Il prend le dernier chiffre non nul de l'entrée, plus les zéros de fin, et le déplace au début du nombre. Devient
9010300
ainsi3009010
. Tout nombre avec n chiffres non nuls fera partie d'un cycle de n longueurs.L'entrée est une chaîne dans n'importe quelle base via STDIN, la sortie est une chaîne dans cette base.
la source
Python, 43
L' inverse de la fonction du Sp3000 , implémenté récursivement.
La fonction est un cycle suivi d'un cycle deux suivi d'un cycle trois, ...
L'opération
n%k+1
agit comme unk
cycle sur les nombres1..k
. Pour trouver ce qui convientk
à utiliser, déplacez tout vers le bas park=1
, puisk=2
, et ainsi de suite, jusqu'àn<=k
.la source
Pyth, 15 octets
La réponse la plus courte à ce jour qui utilise des opérations numériques plutôt que des opérations de chaîne.
L'effet de cette fonction sur la représentation binaire est d'étendre le bloc de 1s le plus à droite dans le 0 suivant; ou s'il n'y a pas de 0, pour le réinitialiser à un seul 1:
Pyth, 26 octets, variante amusante
Effectue l'opération ci-dessus simultanément sur tous les blocs de 1, pas seulement sur celui de droite, en n'utilisant toujours que des opérations binaires et arithmétiques.
la source
Swift 1.2, 66 octets
la source
Brachylog , 5 octets
Essayez-le en ligne!
Port de la réponse Pyth de @ orlp. Sort simple et soigné:
Je voulais à l'origine porter la solution Python de @ Sp3000, mais cela a pris 23 octets :
Essayez-le en ligne!
la source
JavaScript (ES6), 43 octets
la source
Matlab (189)
La fonction:
Mappe tout entier en fonction de ses facteurs premiers, si le nombre est nul ou factorisé en 2 ou 1, le nombre est mappé sur lui-même, sinon nous choisissons le plus grand facteur premier de ce nombre, puis nous incrémentons les différents facteurs premiers restants du plus proche plus grand facteur premier jusqu'à ce que nous atteignions le nombre
biggest_prime^n
oùn
est la somme de tous les exposants de tous les facteurs, une fois que nous atteignons ce montant, nous nous tournons versmax_prime*2^(n-1)
et nous reproduisons à nouveau le même cycle.la source
Matlab (137)
2
jusqu'à ce que nous tombions sur un exposant2
qui est divisible par la somme des exposants d'autres facteurs premiers. nous passons ensuite au début du cycle en divisant par2^(sum of exponents of other primes)
. les autres engourdis sont mappés sur eux-mêmes.la source