Bijective mapping from integers to a variable number of bits
Python, 20 bytes
lambda n:bin(~n)[4:]
Test:
>> [bin(~n)[4:] for n in range(16)]
['', '0', '1', '00', '01', '10', '11', '000', '001', '010', '011', '100', '101', '110', '111', '0000']
Doing lambda n:bin(n+1)[3:]
increments the input, then takes the binary representation with the first symbol removed ([3:]
because the prefix 0b
is two chars chars). Since any positive number starts with 1 in binary, this uniquely gives a binary representation.
A byte is saved by instead using the bit complement ~n
to get the negation -(n+1)
, and removing the negative sign by chopping off one more symbol.
Jelly, 3 bytes
‘BḊ
Same idea as xnor: maps 0 1 2 3 4 ...
to [] [0] [1] [0 0] [0 1] ...
; the code is basically increment → binary → remove first
.
Try it out online.
Pyth, 5 bytes
t.BhQ
Simply a translation of xnor's answer into Pyth.
Q
is eval()'d input(), h
increments it, .B
converts it to a binary string, and t
takes the "tail" (which is everything except the first character).