Associé, mais cela ne nécessite que des nombres entiers positifs et ne doit pas être commutatif
La fonction de couplage Cantor est décrite dans cet article Wikipedia . Il s'agit essentiellement d'une opération telle que lorsqu'elle est appliquée à deux valeurs X et Y, on peut obtenir les valeurs d'origine X et Y compte tenu du résultat.
Votre tâche consiste à concevoir deux fonctions: l'une qui fonctionne X, Y -> Z
et l'autre qui fonctionne Z -> X, Y
. Voici le hic: X, Y -> Z
doit être commutatif. Cela signifie que vous Z -> X, Y
ne pourrez pas déterminer si l'entrée était X, Y
ou Y, X
.
La définition officielle de ce défi serait:
Choisissez un ensemble infini dénombrable S de nombres.
Concevez deux fonctions qui effectuent les tâches suivantes:
- Étant donné une paire de valeurs non ordonnée dans S, renvoyer une valeur dans S
- Étant donné une valeur de retour de la fonction initiale, renvoyez la paire de valeurs non ordonnée qui est évaluée à l'entier d'entrée lorsqu'elle est passée par la première fonction. Je me fiche du comportement de cette fonction inverse si l'entrée n'est pas une valeur de retour de la première fonction.
Exigences
- Le résultat doit être identique entre les exécutions.
{a, a}
est une paire non ordonnée
Remarque: votre réponse est plus susceptible d'obtenir un vote positif de ma part si vous fournissez une preuve, mais je testerai les réponses dès que j'y arriverai et je voterai une fois que je suis assez sûr que cela fonctionne.
1,2
est l'une des paires,1,3
peut également être une paire potentielle (les deux utilisent1
)?f
et son inverseg
,sorted((x, y))
devrait être le même quesorted(g(f(x, y)))
Réponses:
Haskell , 65 + 30 = 95 octets
Essayez-le en ligne!
Essayez-le en ligne!
Remarque: lorsque les deux fonctions peuvent partager du code, cela ne représente que 75 octets:
Essayez-le en ligne! Le domaine est les entiers positifs. La fonction
(#)
effectue l'appariement, la fonction(l!!)
son inverse. Exemple d'utilisation: Both(#) 5 3
et(#) 3 5
yield12
, and(l!!) 12
yields(5,3)
.Cela fonctionne en listant explicitement toutes les paires triées dans une liste infinie
l
:L'encodage n'est alors que l'index de cette liste.
la source
Pyth , 8 + 6 = 14 octets
Essayez-le en ligne!
Essayez-le en ligne!
Domaine: entiers positifs.
la source
2
et10
par exemple (qui sont dans le domaine)Gelée , 8 + 11 = 19 octets
Annulé car l'algorithme de Rod ne fonctionnait pas.
Cela fonctionne sur le domaine des entiers positifs.
Prend
x
ety
comme 2 arguments, peu importe l'ordre, retournez
.Essayez-le en ligne!
Prend
z
et retourne[min(x, y), max(x, y)]
Essayez-le en ligne!
la source
JavaScript (ES7), 44 octets
Mappe des entiers non négatifs à un sous-ensemble de ceux-ci.
la source
C (gcc) , 36 + 39 = 75 octets
Merci à @tsh d'avoir économisé deux octets.
Le domaine est composé d'entiers non négatifs.
Prend
x
ety
retournez
.Prend un
int
tableau à deux éléments . Le deuxième élément doit être défini surz
avant l'appel. Après l'appelr
contientx
ety
.Essayez-le en ligne!
la source
(x+1)
->-~x
Gelée ,
1311 octetspaire d'entiers positifs à entier positif, 5 octets
Essayez-le en ligne!
entier positif à une paire d'entiers positifs, 6 octets
Essayez-le en ligne!
Algorithme
Si nous trions l'ensemble de toutes les paires d'entiers positifs non ordonnées par leur maximum puis par leur somme, nous obtenons la séquence suivante.
{1,1}, {1,2}, {2,2}, {1,3}, {2,3}, {3,3}, {1,4}, {2,4}, {3 , 4}, {4,4}, {1,5}, {2,5}, {3,5}, {4,5}, {5,5},…
La première fonction prend une paire {x, y} et trouve son index dans cette séquence.
La deuxième fonction prend un entier positif z et retourne le z ème élément de la séquence.
Notez que ce mappage est le même que dans la réponse Jelly de @ EriktheOutgolfer .
Comment ça fonctionne
la source
c
etŒċ
... bien que je puisse me tromper. BTW c'était ma réponse que vous avez surpassé> _>Mathematica (35 + 53) = 78 octets
C'est la seule bonne fonction d'appariement quadratique connue pour Z <--> ZxZ combinée avec Min et Max pour la rendre sans ordre.
la source
Rubis, 66 octets
J'essaie de trouver un moyen de sélectionner astucieusement un ensemble infini pour rendre cela plus facile, c'est le meilleur que j'ai à ce jour.
On définit f (x, y) = 2 x-1 au niveau du bit ou 2 y-1 . Le domaine se compose de l'ensemble défini récursivement comme contenant 1,2 et de tous les nombres qui peuvent être produits en appelant f aux nombres de l'ensemble (notez que f (1,1) = 1 et f (2,2) = 2, donc 1 et 2 ont des inverses). Les nombres résultants ont tous un ou deux 1 dans leur expansion binaire, les indices des 1 correspondant aux nombres de l'ensemble. Nous pouvons obtenir la paire non ordonnée d'origine en prenant les indices. S'il n'y a qu'un seul 1, cela signifie que les éléments de la paire sont égaux.
Par exemple, f (3,5) est 20, car 20 est 10100 en base 2, qui a 1s aux 3e et 5e places les moins significatives.
la source
Java 8,
153146141137 +268224216205 octetsFonction paire
Essayez-le en ligne!
Fonction Depair
Essayez-le en ligne!
la source
int i=(""+a[0]).length()
peut êtreint i=(f+a[0]).length()
; l'espace entrec=0,j;i>0;
peut être supprimé;a[0].parseInt
peut êtrenew Integer
. Dans la fonction dépair: les troisr.parseInt
peuvent êtrer.decode
; et vous pouvez créer une variable int pourt.length()
, puisque vous l'utilisez deux fois.05AB1E , 6 + 11 = 17 octets
Port de ma réponse Jelly.
Domaine: entiers positifs.
Prend une liste
[x, y]
en entrée, retournez
.Essayez-le en ligne!
Prend un entier positif
z
en entrée, retourne[min(x, y), max(x, y)]
.Essayez-le en ligne!
-5 grâce à Emigna .
la source
2ã€{RÙR
!JavaScript, 72 octets
Fonctionne pour les entiers positifs (en théorie). Idée assez simple: trier deux nombres dans un certain ordre (magique), les connecter sous forme de chaîne par une lettre
"a"
, les analyser en entier hexadécimal.Afficher l'extrait de code
la source
MATL, 6 + 8 = 14 octets
Fonction d'encodage, prend deux entrées n, m. Produit le produit du nième premier et du mième premier.
Pas:
,
- Faites deux foisi
- Entrée pushYq
- Entrée pop, entrée push'th prime]*
- Finissez deux fois, éclatez les deux nombres premiers et poussez le produitFonction de décodage, prend une entrée m. Génère le nombre de nombres premiers en dessous de chacun des facteurs premiers de n.
Pas:
i
- Entrée pushYf
- Entrée pop, push tableau de facteurs premiers"
- Pour n dans le tableau@Zq
- Poussez le tableau de nombres premiers en dessous de nn
- Tableau pop, longueur push du tableauCeci est commutatif parce que la multiplication est commutative et injectif parce que les factorisations premières sont uniques. Non pas que ce ne soit pas sur les entiers.
la source
Coque , 5 + 3 = 8 octets
J'espère vraiment avoir relevé le défi, je vois des réponses supprimées qui me semblent valables ...
Couples d'entiers positifs à un seul entier positif:
Essayez-le en ligne!
Il fonctionne en prenant les nombres aux indices donnés (indexés 1) dans la liste des nombres premiers et en les multipliant.
Résultat de la première fonction aux couples d'entiers positifs:
Essayez-le en ligne!
Nous factorisons le nombre d'entrée et renvoyons l'index dans la liste des nombres premiers de tous (les deux) de ses facteurs.
Exemple travaillé
Étant donné
(4,1)
un couple de départ, nous prenons les quatrième et premier nombres premiers(7,2)
et les multiplions →14
. Cette multiplication est ce qui rend la fonction indépendante de l'ordre des deux éléments.À partir de
14
, nous le factorisons(2,7)
et retournons les indices de2
et7
dans la liste des nombres premiers →(1,4)
.la source
C # , 80 octets (38 + 42)
Les données
Encodeur
Int32
l
un nombreInt32
r
un nombreInt64
Les deux entrées fusionnées ensembleDécodeur
Int32
v
la valeurInt32[]
Un tableau avec les deux entrées d'origine.Golfé
Non golfé
Non lisible non lisible
Code complet
Communiqués
80 bytes
- Solution initiale.Remarques
la source
Python: 41 + 45 = 86
encodeur: 41
décodeur: 45
Tentative plus ancienne:
Python: 114: 30 + 84
encodeur: 30
accepte 2 entiers, retourne une chaîne
décodeur: 86
décodeur2: 120
une autre tentative avec des compréhensions de générateur et somme
la source
e=lambda*x:10**sum(x)-10**min(x);d=lambda z:map(
z.count,'09')
; TIO