Dans ce défi, il vous sera demandé d'implémenter toute fonction (ou programme complet) qui remplit deux propriétés. Ces propriétés sont:
Votre fonction doit être une fonction injective (réversible) des polynômes à coefficients entiers non négatifs aux entiers non négatifs. Cela signifie que deux entrées inégales ne peuvent pas correspondre à une sortie égale.
Votre fonction doit conserver le nombre total de "sur bits" de son entrée à sa sortie. Cela signifie que si vous comptez les 1 bits de chaque coefficient du polynôme, leur somme doit être la même que le nombre de 1 bits dans la représentation binaire de la sortie. Par exemple,
9
est1001
en binaire, il a donc 21
bits.
IO
Un polynôme entier non négatif est identique à une liste infinie d'entiers non négatifs de sorte qu'après un certain point, tous les entiers sont nuls. Ainsi, les polynômes peuvent être représentés soit par des listes infinies (bien que ce soit probablement indésirable) soit par des listes finies avec des zéros implicites après la fin de la liste.
La principale distinction entre les polynômes et les listes finies est que l'ajout d'un zéro à la fin d'une liste changera la liste:
En ajoutant un zéro à la fin d'un polynôme ne change pas sa valeur:
Ainsi, si votre fonction prend en entrée une liste finie représentant un polynôme, l'ajout d'un zéro ne doit pas changer son résultat.
Lorsque vous représentez des polynômes sous forme de listes, vous pouvez les représenter avec la première ou la dernière entrée représentant le terme constant. Par exemple, vous pouvez avoir l'une des possibilités suivantes:
Dans le premier cas, l'ajout de zéros à la fin de la liste ne devrait pas modifier le résultat; dans le second cas, l'ajout de zéros au début de la liste ne devrait pas modifier le résultat.
Bien sûr, si votre langue prend en charge les polynômes, vous pouvez les utiliser comme entrées.
La sortie doit être une sortie entière non négative via toutes les méthodes standard.
Il s'agit de code-golf donc les réponses seront notées en octets, avec moins d'octets étant mieux.
[]
ou[0]
une entrée valide?Réponses:
Gelée , 8 octets
Essayez-le en ligne!
Inverse gauche, 5 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
Wolfram Language (Mathematica) ,
3620 octetsEssayez-le en ligne!
Prend un polynôme f (x) en entrée. Évalue y * f (y), où y = 2 ^ (f (2)!). Malheureusement, cela signifie que les sorties deviennent assez grandes.
L'évaluation de y * f (y) préservera le nombre de 1 bits chaque fois que y est une puissance de 2 supérieure à n'importe quel coefficient, ce qui est vrai pour la valeur choisie ci-dessus. On choisit y = 2 ^ (f (2)!) Pour rendre le résultat injectif:
la source
Wolfram Language (Mathematica) , 61 octets
Essayez-le en ligne!
Deux entiers positifs peuvent être mappés sur un seul entier positif. Soit
a, b
deux entiers positifs. alorsa, b -> (2a - 1) 2^(b-1)
, est une bijection de NxN à N.Cette fonction trouve la position de tous
1
bits dans l'entrée (à partir de la position 1) et applique une variante uniquement injective de la carte ci-dessus à chaque position. Ensuite, chaque nombre résultant est élevé à la puissance de deux, et tous les nombres sont additionnés (ce qui est correct puisque nous avons appliqué une carte NxN -> N injective).Par exemple:
Fonction inverse (124 octets)
Voici une fonction inverse pour tester l'injectivité.
Essayez-le en ligne!
la source
Python 2 ,
118117114103100 octets100 octets de Jonathan Frech:
Essayez-le en ligne!
103 octets avec possibilité de jouer au golf 1
Essayez-le en ligne!
-15 octets grâce à Jonathan Frech
Il crée un nombre qui contient d'abord les "sur bits" puis la représentation unaire du tableau interprétée comme un nombre trinaire.
Le nombre trinaire est créé en convertissant les nombres en chaînes binaires (
0bNNN
), puis en les remplaçantb
par2
.1 J'aurais pu économiser 14 octets en le convertissant à la place en un nombre de base 12, mais TIO a manqué de mémoire, j'ai donc décidé de l'utiliser.
la source
05AB1E , 14 octets
Essayez-le en ligne!
Donne les mêmes résultats que la solution de gelée de Dennis, mais la technique est légèrement différente.
Comment?
Essayons l'entrée
[1, 2, 3]
:la source
Python 2 , 74 octets
Essayez-le en ligne!
la source
JavaScript 6,
9683 octetsgénère une expression binaire
la source
replace(/0|2/g,0)
semble aussi fonctionner, mais plus difficile à décoderx=>(t=x.map(k=>(x[0]+=k)&&2+k.toString(2)).join``).replace(/2/g,'0'.repeat(t))
. Sentez-vous bien mais ne pouvez pas prouver