Un nombre variable de bits est un tableau de 0 ou plusieurs bits. Il en [0, 1]
va de même pour un nombre variable de bits, mais il en est de même []
.
Écrivez une fonction ou un programme qui, étant donné un entier non négatif, renvoie un nombre variable de bits de sorte que chaque entier ait un mappage un à un (bijectif) avec un tableau.
Il existe une quantité infinie de ces mappages, vous êtes libre d'en créer un à votre guise, mais ce doit être un à un. Votre mappage doit conceptuellement être un pour un pour un entier de taille arbitraire, mais c'est OK si votre implémentation échoue pour les grands entiers en raison des limites numériques des types dans votre langue préférée (par exemple, les C int
).
À titre d'exemple de ce qui n'est pas un mappage un à un, il suffit de répertorier les chiffres binaires de l'entier. Dans un tel système, 5 devient [1, 0, 1]
(ou 0b101
), mais ce n'est pas un à un, car 0b0101
ou [0, 1, 0, 1]
signifie également 5.
Il devrait être assez évident qu'un mappage n'est pas un à un s'il saute un entier (par exemple, il ne fonctionne pas pour 5), mais je tiens à préciser que sauter un tableau de bits variable n'est pas non plus un -à une. Vous devez mapper sur tous les tableaux de bits variables possibles, y compris []
.
Le code le plus court en octets gagne.
Réponses:
Gelée, 3 octets
Même idée que xnor: correspond
0 1 2 3 4 ...
à[] [0] [1] [0 0] [0 1] ...
; le code est fondamentalementincrement → binary → remove first
.Essayez-le en ligne .
la source
Python, 20 octets
Tester:
Faire
lambda n:bin(n+1)[3:]
incrémente l'entrée, puis prend la représentation binaire avec le premier symbole supprimé ([3:]
car le préfixe0b
est deux caractères). Étant donné que tout nombre positif commence par 1 en binaire, cela donne uniquement une représentation binaire.Un octet est enregistré en utilisant à la place le complément de bits
~n
pour obtenir la négation-(n+1)
et en supprimant le signe négatif en coupant un symbole de plus.la source
lambda s:int('1'+s,2)-1
.Pyth, 5 octets
Simplement une traduction de la réponse de xnor en Pyth.
Q
est eval () 'd input (), l'h
incrémente, le.B
convertit en une chaîne binaire ett
prend la "queue" (qui est tout sauf le premier caractère).la source
Haskell,
41383029 octetsExemple d'utilisation:
(l!!) 4
->"10"
.En commençant par la liste vide comme premier élément, parcourez la liste paresseusement et ajoutez l'élément actuel avec
0
et avec1
devant.Modifier: @xnor a enregistré
311 octets. Merci!la source
[(0:),(1:)]<*>
<*>
truc, mais je l'ai oublié. Merci encore!l=[]:[b:x|x<-l,b<-[0,1]];(l!!)
.[b:x|x<-l,b<-"01"]
avec un produit ou une carte de concaténation, mais l'expression du produit(:)<$>[0,1]<*>l
va dans le mauvais ordre, en ajoutant d'abord 0 à tout, jamais à 1 car la liste est infinie. As tu des idées?JavaScript (ES6), 29 octets
Même idée que xnor.
la source
Jolf, 4 octets
Essayez-le ici!
Stratégie très simple, se trouve également être la plus courte.
la source
Haskell, 35 octets
Haskell n'a pas de binaire intégré, donc la conversion (inversée) se fait manuellement. Pour supprimer le 1 initial, le cas de base s'est
1
transformé en liste vide.Edit: enregistré un octet en conjuguant à la
+1
place.la source
C, 40 octets
Convertit l'entrée en base bijective 2 (avec symboles
0
et1
), comme les autres réponses.idéone it!
la source