Étant donné un entier positif k > 1
et un entier non négatif i
, générez un k
-tuple (ou k
vecteur -dimensionnel ) d'entiers non négatifs. Pour tout k
, la carte de ℕ à ℕ k , doit être bijective . Autrement dit, chaque entrée i
doit produire un tuple différent, et chaque tuple possible doit être produit par une entrée i
.
Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), la valeur de retour de la fonction ou le paramètre de la fonction (out).
Vous pouvez utiliser n'importe quel format de liste plat pratique et sans ambiguïté pour la sortie.
Votre solution ne devrait pas imposer de limites artificielles k
et i
vous pouvez supposer qu'elles correspondent à la taille entière native de votre langue. À tout le moins, vous devez prendre en charge des valeurs jusqu'à 255
, cependant, même votre taille entière native est plus petite que cela.
Pour tout 1 < k < 32
, votre code devrait produire un résultat en quelques secondes (bien sûr, si votre réponse ne prend pas en charge cette taille en raison de la règle précédente, la limite est ajustée en conséquence). Cela ne devrait pas poser de problème: il est possible de résoudre ce défi de telle sorte qu'il fonctionne jusqu'à 2 128 en quelques secondes, mais la limite est là pour éviter les réponses qui itèrent réellement de à pour trouver le résultat.i < 231
i
0
i
Veuillez inclure dans votre réponse une description de la cartographie que vous avez choisie et une justification de la raison pour laquelle elle est bijective (cela n'a pas besoin d'être une preuve formelle).
C'est le code golf, la réponse la plus courte (en octets) l'emporte.
Défis liés
la source
q~2bW%1$Te]/zWf%2fbp
(ordre d'entrée opposé)CJam, 18 octets
Il utilise une formule plus stupide.
Essayez-le ici .
Explication
En résumé, il associe un entier positif à:
la source
Python 2, 62
Ce code est moche et jouable au golf, mais l'idée est très simple.
Emballez
k
les extensions binaires en une seule en lisant chaquek
e chiffre avec des décalages différents. Par exemple, aveck=3
, l'entrée357
correspond à(3,0,7)
:Le fait de compresser les chiffres ensemble l'inverse, c'est donc une bijection. Ce faisant, pensez aux extensions binaires comme ayant un nombre infini de zéros non significatifs.
la source
J,
382827 octetsIl s'agit d'un verbe dyadique tacite qui prend i et k comme arguments gauche et droit. Essayez en ligne avec J.js .
Idée
Nous définissons une carte f: N → N k par = (α: f (i) 1 , ... α k-1 , p 1 α k ... p 2 α k + 1 ... - 1) , où ⟨p n ⟩ est le séquence de nombres premiers et i + 1 = p 1 α 1 p 2 α 2 … .
Selon le théorème arithmétique fondamental, la carte g: N → N ω définie par g (i): = (α 1 , α 2 ,…) (exposants de la factorisation en facteurs premiers de i + 1 ) est bijective.
Puisque f (i) = (g 1 (i),… g k-1 (i), g -1 (g k (i), g k + 1 (i),…)) , la carte f est bijective comme bien.
Code
la source
Python 2, 72
La fonction
q
agit sur les nombres binaires en prenant chaque deuxième bit à partir de la fin. En conséquence,q(z), q(z>>1)
donne deux nombres dont les chiffres binaires s'interpénètrent pour donnerz
. Par exemple, 594 se divise en 12 et 17.Il s'agit d'une bijection car nous pouvons compresser les numéros ensemble pour récupérer le numéro d'origine.
La fonction
g
applique cesk-1
temps de bijection , passant d'un seul élément à une paire à un triple ... à unk
-tuple. Chaque fois, le dernier élément est développé en deux éléments. Cela se fait de manière récursive en mappant l'entrée à une paire via la bijection, en prenant le premier élément de la paire pour la première entrée de la sortie et en appliquant la fonction récursivement aveck-1
au deuxième élément pour produire les entrées restantes.la source