Um número variável de bits é uma matriz de 0 ou mais bits. Então, [0, 1]
é um número variável de bits, mas assim é []
.
Escreva uma função ou programa que, dado um número inteiro não negativo, retorne um número variável de bits, de modo que todo número inteiro tenha um mapeamento um para um (bijetivo) com uma matriz.
Há uma quantidade infinita desses mapeamentos, você pode criar um como quiser, mas deve ser um a um. Conceitualmente, seu mapeamento deve ser individual para um número inteiro de tamanho arbitrário, mas tudo bem se sua implementação falhar para números inteiros grandes devido a limites numéricos de tipos no seu idioma preferido (por exemplo, C's int
).
Como exemplo do que não é um mapeamento um para um, basta listar os dígitos binários do número inteiro. Nesse sistema, 5 se torna [1, 0, 1]
(ou 0b101
), mas não é um para um, porque 0b0101
ou [0, 1, 0, 1]
também significa 5.
Deveria ser óbvio que um mapeamento não é individual se pular um número inteiro (por exemplo, não funciona para 5), mas eu gostaria de deixar claro que ignorar uma matriz de bits variável também não é uma. -para um. Você deve mapear a cada matriz de bits variável possível, inclusive []
.
código mais curto em bytes vitórias.
Respostas:
Geléia, 3 bytes
Mesma idéia que xnor: mapeia
0 1 2 3 4 ...
para[] [0] [1] [0 0] [0 1] ...
; o código é basicamenteincrement → binary → remove first
.Experimente online .
fonte
Python, 20 bytes
Teste:
Fazer
lambda n:bin(n+1)[3:]
incrementa a entrada e, em seguida, pega a representação binária com o primeiro símbolo removido ([3:]
porque o prefixo0b
é dois caracteres e caracteres). Como qualquer número positivo começa com 1 em binário, isso fornece exclusivamente uma representação binária.Um byte é salvo usando o complemento de bits
~n
para obter a negação-(n+1)
e removendo o sinal negativo cortando mais um símbolo.fonte
lambda s:int('1'+s,2)-1
.Pitão, 5 bytes
Simplesmente uma tradução da resposta de xnor para Pyth.
Q
is eval () 'd input (),h
incrementa-o,.B
converte-o em uma string binária et
pega o "tail" (que é tudo, exceto o primeiro caractere).fonte
Haskell,
41383029 bytesExemplo de uso:
(l!!) 4
->"10"
.Começando com a lista vazia como o primeiro elemento, percorra vagarosamente a lista e acrescente o elemento atual com
0
e com1
na frente dele.Edit: @xnor salvou
311 bytes. Obrigado!fonte
[(0:),(1:)]<*>
<*>
truque antes, mas eu esqueci o assunto. Obrigado novamente!l=[]:[b:x|x<-l,b<-[0,1]];(l!!)
.[b:x|x<-l,b<-"01"]
com um produto ou mapa de concat, mas a expressão do produto(:)<$>[0,1]<*>l
está na ordem errada, primeiro acrescentando 0 a tudo, nunca chegando a 1 porque a lista é infinita. Você tem alguma ideia?JavaScript (ES6), 29 bytes
Mesma idéia que xnor.
fonte
Jolf, 4 bytes
Experimente aqui!
Estratégia muito simples, também é a mais curta.
fonte
Haskell, 35 bytes
O Haskell não possui um binário interno, portanto a conversão (reversa) é feita manualmente. Para remover o 1 inicial, o caso base foi
1
transformado na lista vazia.Editar: Salva um byte conjugando com o
+1
invés.fonte
C, 40 bytes
Converte a entrada na base bijetiva 2 (com símbolos
0
e1
), como as outras respostas.ideone isso!
fonte