Un número variable de bits es una matriz de 0 o más bits. Entonces, [0, 1]
es un número variable de bits, pero también lo es []
.
Escriba una función o programa que, dado un número entero no negativo, devuelva un número variable de bits, de modo que cada número entero tenga un mapeo uno a uno (biyectivo) con una matriz.
Hay una cantidad infinita de tales mapeos, usted es libre de construir uno a su gusto, pero debe ser uno a uno. Su mapeo debe ser conceptualmente uno a uno para un número entero de tamaño arbitrario, pero está bien si su implementación falla para números enteros grandes debido a los límites numéricos de los tipos en su idioma preferido (por ejemplo, C int
).
Como ejemplo de lo que no es un mapeo uno a uno, es simplemente enumerar los dígitos binarios del entero. En dicho sistema, 5 se convierte [1, 0, 1]
(o 0b101
), pero no es uno a uno, porque 0b0101
o [0, 1, 0, 1]
también significa 5.
Debería ser bastante obvio que un mapeo no es uno a uno si omite un número entero (por ejemplo, no funciona para 5), pero me gustaría dejar en claro que omitir una matriz de bits variable tampoco es uno -a uno. Debe asignar a cada matriz de bits variable posible, incluida []
.
El código más corto en bytes gana.
Respuestas:
Jalea, 3 bytes
La misma idea que xnor: asigna
0 1 2 3 4 ...
a[] [0] [1] [0 0] [0 1] ...
; El código es básicamenteincrement → binary → remove first
.Pruébalo en línea .
fuente
Python, 20 bytes
Prueba:
Hacer
lambda n:bin(n+1)[3:]
incrementa la entrada, luego toma la representación binaria con el primer símbolo eliminado ([3:]
porque el prefijo0b
es dos caracteres). Dado que cualquier número positivo comienza con 1 en binario, esto únicamente da una representación binaria.En su lugar, se guarda un byte utilizando el complemento de bits
~n
para obtener la negación-(n+1)
y eliminando el signo negativo cortando un símbolo más.fuente
lambda s:int('1'+s,2)-1
.Pyth, 5 bytes
Simplemente una traducción de la respuesta de xnor a Pyth.
Q
es eval () 'd input (), loh
incrementa, lo.B
convierte en una cadena binaria yt
toma la "cola" (que es todo excepto el primer carácter).fuente
Haskell,
41383029 bytesEjemplo de uso:
(l!!) 4
->"10"
.Comenzando con la lista vacía como el primer elemento, recorra perezosamente la lista y agregue el elemento actual con
0
y1
delante de él.Editar: @xnor guardó
311 bytes. ¡Gracias!fuente
[(0:),(1:)]<*>
<*>
truco antes, pero lo olvidé. ¡Gracias de nuevo!l=[]:[b:x|x<-l,b<-[0,1]];(l!!)
.[b:x|x<-l,b<-"01"]
con un producto o concat-map, pero la expresión del producto(:)<$>[0,1]<*>l
va en el orden incorrecto, anteponiendo primero 0 a todo, nunca llegando a 1 porque la lista es infinita. ¿Tienes alguna idea?JavaScript (ES6), 29 bytes
La misma idea que xnor.
fuente
Jolf, 4 bytes
Pruébalo aquí!
Estrategia muy simple, también resulta ser la más corta.
fuente
Haskell, 35 bytes
Haskell no tiene un binario incorporado, por lo que la conversión (invertida) se realiza manualmente. Para eliminar el 1 inicial, el caso base se
1
transforma en la lista vacía.Editar: guardado un byte conjugando con el
+1
en su lugar.fuente
C, 40 bytes
Convierte la entrada a la base biyectiva 2 (con símbolos
0
y1
), como las otras respuestas.ideonelo!
fuente