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.
la source
Réponses:
Pyth,
2718 octetsExplication (Pyth initialise
Q
à l'entier d'entrée):Cela a des cycles
(−1)
(0, −2)
(1, −3, −4)
(2, −5, −7, −6)
(3, −9, −13, −11, −8)
(4, - 17, −25, −21, −15, −10)
(5, −33, −49, −41, −29, −19, −12)
(6, −65, −97, −81, −57, 6, −65, −97, −81, −57, −37, −23, −14)
(7, −129, −193, −161, −113, −73, −45, −27, −16)
(8, −257, −385, −321, −225) , −145, −89, −53, −31, −18)
(9, −513, −769, −641, −449, −289, −177, −105, −61, −35, −20)
⋮
Le cycle de longueur n est donné par
( n - 2,
−2 ^ ( n - 2) ⋅1 - 1,
−2 ^ ( n - 3) ⋅3 - 1,
−2 ^ ( n - 4) ⋅5 - 1,
…,
−2 ^ 2 ⋅ (2 · n - 7) - 1,
−2 ^ 1⋅ (2 · n - 5) - 1,
−2 ^ 0⋅ (2 · n - 3) - 1).
Chaque entier k ≥ -1 apparaît comme le premier élément du cycle ( k + 2). Pour chaque entier k <−1, nous pouvons écrire de façon unique 1 - k = 2 ^ i ⋅ (2⋅ j + 1) pour certains i , j ≥ 0; alors k apparaît comme le ( j + 2) ème élément du cycle ( i + j + 2).
la source
MATL , 47 octets
Essayez-le en ligne!
Explication générale
La fonction 2 ci-dessous est la même que celle utilisée dans la réponse de @ Sp3000 au défi associé. Merci à @ Agawa001 de l'avoir remarqué.
La fonction est la composition de trois:
Fonctions 1 et 3 sont utilisés car il est plus facile (je crois) pour obtenir le comportement souhaité en N qu'en Z .
La fonction 2 est la suivante: la ligne supérieure est le domaine, la ligne inférieure est le domaine codé. Les virgules sont utilisées pour plus de clarté:
Le premier bloc (de haut
1
en bas1
) est un cycle de longueur 1. Le second (de2 3
à3 2
) est un cycle de longueur 2, etc. Dans chaque bloc, la partie inférieure (image de la fonction) est la partie supérieure décalée circulairement un pas à droite.La fonction 1 est la suivante:
La fonction 3 est la même que 1 avec les deux lignes inversées.
Exemples
L'image de l'
3
est-5
. Le premier3
est mappé7
par la fonction 1;7
est ensuite mappé10
par la fonction 2;10
est ensuite mappé à -5` par la fonction 3.Le cycle de longueur 1 est
0
. Le cycle de longueur 2 est-1 1
. Le cycle de longueur 3 est-3 2 -2
, etc.Explication du code
Les fonctions 1 et 3 sont simples.
La fonction 2 fonctionne en trouvant le point final inférieur du bloc d'entrée correspondant. Par exemple, si l'entrée de cette fonction est
9
trouvée7
(voir les blocs ci-dessus). Il sélectionne ensuite le point de terminaison supérieur, qui est10
dans l'exemple. Le déplacement circulaire du bloc est obtenu grâce à l'indexation modulaire basée sur MATL.la source
Python 2, 55 octets
59 octets:
Crée les cycles
Modifié à partir de ma solution sur le défi précédent , qui est modifié à partir de la construction du Sp3000 .
La fonction
crée des cycles de taille impaire de nombres non négatifs
Pour trouver la taille de cycle correcte
k
, décaler l'entrée vers len
bask=1,3,5,7,...
jusqu'à ce que le résultat soit dans l'intervalle[0,k)
. Faites défiler cet intervalle avec l'opérationn->(n+1)%k
, puis annulez toutes les soustractions effectuées sur l'entrée. Ceci est implémenté récursivement park+g(n-k,k+2)
.Maintenant, nous avons besoin du négatif pour faire les cycles pairs. Notez que si nous modifions
g
pour commencerk=2
dansg
, nous aurions des cycles de taille égaleCes bijects aux négatifs via bit-complément
~
. Donc, quandn
est négatif, nous évaluons simplementg(n)
comme~g(~n,2)
.la source
k
semble êtreMath.floor(Math.sqrt(n))*2+1
.Python 3, 110 octets
Je n'ai toujours pas compris comment obtenir un lambda
si n est un nombre triangulaire [1,3,6,10,15,21,28, etc ...] alors f (n) est l'ordre dans la liste multiplié par un négatif. si le nombre est négatif, donnez-lui 1 + le plus petit nombre de triangle suivant. sinon, incrémenter.
Exemple: 5 n'est pas un nombre triangulaire, alors ajoutez 1.
La prochaine itération, nous avons 6. 6 est un nombre triangulaire, et c'est le 3ème de la liste, donc vient -3.
Le programme donne ces listes
longueur 1: [0]
longueur 2: [1, -1]
longueur 3: [2,3, -2]
longueur 4: [4,5,6, -3]
longueur 5: [7,8,9,10, -4]
Edit: Merci encore à @TuukkaX pour avoir supprimé les caractères en excès.
la source
0.5
pour.5
etinput('')
versinput()
.Python 3, 146 octets
Pour chaque nombre supérieur à 0, il existe des boucles paires (len 2,4,6,8 ...), et inférieures à 0, des boucles impaires (1,3,5,7). 0 correspond à 0.
(-3, -2, -1), (0), (1,2), (3,4,5,6)
correspond à
(-2, -1, -3), (0), (2,1), (6,3,4,5)
Edit: @TuukkaX a enlevé 8 octets de la solution précédente. Et encore 3.
la source
mi
pourrait être changé en quelque chose de plus petit, commeb
.f=lambda x:1+2*int(abs(x)**0.5)if x<1 else 2*int(x**0.5+0.5) x=int(input()) n=f(x) if x>0:b=n*(n-2)/4 else:b=-((n+1)/2)**2 print(b+1+(x-b-2)%n)
input('')
pourinput()
. Les guillemets sont inutiles car nous n'avons rien à imprimer sur la console lorsque nous voulons simplement obtenir l'entrée.f=lambda x:1+2*int(abs(x)**.5)if x<1 else 2*int(x**.5+.5) x=int(input());n=f(x) if x>0:b=n*(n-2)/4 else:b=-((n+1)/2)**2 print(b+1+(x-b-2)%n)
Matlab (423)
Non compétitif car il bat un bon record de condidate pour le dernier classement, alors que j'ai du mal à le raccourcir le plus possible.
Quelques bugs non sensés concernant la précision dans matlab que je ne pouvais pas trouver d'autre que de rendre mon code sarcastique, en revanche le mappage que j'opte était en termes de facteurs principaux et de logarithme n-aire.
Exécution
Explication
Sachant, tout d'abord, qu'un nombre quelconque peut être écrit comme le produit d'exposants de nombres premiers
N=e1^x1*e2^x2...
de cette base, j'ai choisi de cartographier des images de cyclesC
qui sont extraites du plus grand exposant du plus petit facteur (pas nécessairement premier) que N est une puissance parfaite de .en termes plus simples, soit
N=P^x
où P est la plus petite racine parfaite,x
désigne précisément deux termes essentiels pour le cycle:,x=Ʃ(r*P^i)
un termeP
est la base du cycle ainsi qu'une racine parfaite pour le nombre principal N, etk
est le degré du cycleC=p^k
, oùi
varie entre 1 et k, le coefficientr
est incrémenté de 1 et limité par P-1 pour toute pré-image suivante jusqu'à ce que tous les coefficients soient définis sur r = 1, nous passons donc au début de ce cycle.Pour éviter les collisions entre les cycles, le choix de l'exponentiation des nombres premiers plutôt que de leurs produits est précis, car comme un exemple de deux cycles de bases
3
et d'2
un point de rencontre entre eux, cela peut être3*2
évité car un cycle est défini par son degré plus que son base, et pour le point de rencontre, il y a un autre cycle de base6
et de degré 1.Les nombres négatifs placent une exception, quant à lui, j'ai réservé des degrés impairs pour les nombres négatifs, et même des degrés pour le reste. Comment ?
pour tout nombre N intégré dans un cycle
P^k
, est écrit commeP^(a0*P^i0+a1*P^i1+...)
, la quantité(a0*P^i0+a1*P^i1+...)
est transaltée en base P-aire commea0,a1,....
, pour clarifier ce point si (p = 2) la séquence doit être en base binaire. Comme on le sait de façon réaliste sans définir la condition des degrés positifs / négatifs et l'exception (+/- 1), un nombre N est sur les bords d'un cycle de degrék
si et seulement si la séquenceA
est écrite comme1111..{k+1}..10
ou111..{k}..1
pour toutes les bases, sinon aucune rotation n'est nécessaire, affectant ainsi une condition négative / positive pour un degré impair / pair respectifk/k'
pour les deux crée une séquence impaire écrite sous la forme101..{k}..100
, une séquence paire est écrite sous la forme101..{k'}..10
pour un bord de début d'un cycle numérique négatif / positif respectivement .Exemple:
En prenant un nombre
N=2^10
,x=10=2^1+2^3
la séquence A est écriteA=1010
, ce type de séquence symptomatique d'un bord fini de cycle numérique positif, qui estC=2^3
, donc l'image suivante est celle du bord de départA=011
qui est8
, mais , en standardisant ce résultat à (+ / -) 1 exception2^10/2
mappe8/2
et l'image précédente ne doit pas être tournée.En prenant un nombre
N=-3^9
,x=9=3^2
la séquence A est écriteA=100
, ce type de séquence symptomatique d'un bord fini de cycle numérique négatif, qui estC=3^1
, donc l'image suivante est celle du bord de départA=01
qui est3
, Mais, en adaptant ce résultat à négatif / positif condition-3^9
correspond à-3
.pour le couple
(-/+)1
, j'ai envisagé de l' introduire dans un certain nombre de bases cycliques2
, sous prétexte qu'une séquence ordinaire de groupes cycliques{2,4}{8,16,32,64}..
est constituée sous une autre forme{1,2}{4,8,16,32}..
, cela évite toute perte d'éléments précédents, et l'opération effectuée ne fait que changer avec l'éclatement un nouvel élément.Résultats:
exécuter cette petite feuille de code pour vérifier les premières plages raisonnables de nombres cycliques:
Cela conduit à ces résultats
Le dernier est une erreur de segmentation mais il correspond à la plage d'entiers signés standard [-127,127].
la source
JavaScript (ES6), 73 octets
Fonctionne en énumérant la séquence (0, -1, 1, -2, 2, -3, 3, ...) jusqu'à ce qu'elle trouve
n
, en comptant les cycles au fur et à mesure.i
contient l'entrée actuelle;j
contient le début du cycle en cours,k
l'index dans le cycle,l
la durée du cycle en cours etm
l'entrée suivante dans la séquence. Une fois que nous trouvons,n
nous prenons alorsj
si nous sommes à la fin d'un cycle oum
non.la source