Normalmente, decompomos um número em dígitos binários atribuindo-o com potências de 2, com um coeficiente de
0
ou1
para cada termo:
25 = 1*16 + 1*8 + 0*4 + 0*2 + 1*1
A escolha de
0
e1
é ... não muito binária. Realizaremos a verdadeira expansão binária expandindo com potências de 2, mas com um coeficiente de1
ou-1
:
25 = 1*16 + 1*8 + 1*4 - 1*2 - 1*1
Agora isso parece binário.
Dado qualquer número positivo, deve ser trivial ver que:
- Todo número ímpar tem infinitas expansões binárias verdadeiras
- Todo número par não possui expansões binárias verdadeiras
Portanto, para que uma verdadeira expansão binária seja bem definida, exigimos que a expansão seja mínima , ou seja, com o menor comprimento.
Dado qualquer número inteiro positivo e ímpar n
, retorne sua verdadeira expansão binária, do dígito mais significativo para o dígito menos significativo (ou em ordem inversa).
Regras:
- Como esse é o código-golfe , você deve fazer isso na menor contagem de bytes possível. Builtins são permitidos.
- Qualquer saída que possa representar e listar os coeficientes é aceitável: uma matriz, uma sequência de coeficientes com separadores, etc ...
- Aplicam-se lacunas de golfe padrão.
- Seu programa deve funcionar para valores dentro do tamanho inteiro padrão do seu idioma.
Casos de teste
25 -> [1,1,1,-1,-1]
47 -> [1,1,-1,1,1,1]
1 -> [1]
3 -> [1,1]
1234567 -> [1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1]
0
vez do -1
estado de baixa tensão. O chamador que recebe os bits sabe o que eles significam. (Ainda é um exercício de manipulação de bits não-trivial, uma vez que uma rotação direita só funciona se tiver 32 bits significativos por exemplo, um número 5 bits precisa de uma largura de rotação de 5..)
111-1-1
uma saída válida para 25
?