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 para25
?Respostas:
Japonês , 6 bytes
Experimente online!
Explicação:
fonte
Pitão ,
1211 bytesExperimente aqui!
Como?
Primeiro, notamos que a tarefa é apenas "substituir os
0
s na escrita binária por-1
s e deslocar para a direita por 1 lugar". - É exatamente o que devemos fazer! A conversão binária dá-nos uma lista de0
s e1
s. Tudo o que deve fazer aqui é encontrar uma maneira golfy para converter0
para-1
. O operador bit a bit|
(OR bit a bit) é nosso amigo. O mapa sobre a representação binária mudou com|
e-1
. Se o número atual for0
, ele será convertido em-1
.fonte
Perl 6
Versão em cadeia, 31 bytes
Experimente online!
Versão da lista, 36 bytes
Experimente online!
fonte
JavaScript (ES6),
3534 bytesSnippet de teste
Mostrar snippet de código
fonte
Perl 6 , 72 bytes
Certamente há uma maneira melhor, mas é isso que eu tenho ...
Experimente online!
Explicação : É uma função que recebe um argumento (
->$a
). Primeiro obtemos o número de coeficientes necessários ($a.base(2).chars
= número de caracteres na representação da base 2) e, em seguida, fazemos um produto cartesiano (X
) com muitos pares(1,-1)
. (O[X]
meio: reduza a lista a seguir comX
.) Portanto, obtemos uma lista de todas as combinações possíveis de 1s e -1s. Em seguida, filtramos (grep
) apenas as listas que codificam o número fornecido$a
. Existe apenas um, então obtemos uma lista de uma lista com os coeficientes.O bloco grep faz isso: pega seu argumento como uma lista (
@^a
), o reverte e o fecha com uma lista infinita0,1,2,...
usando o operador "left bit shift"+<
. O zíper pára assim que a lista mais curta se esgota (bom para nós!) Em seguida, somamos todos os resultados e comparamos com o número fornecido. Tivemos que usar.reverse
porque o OP exige que os coeficientes estejam na ordem do mais significativo para o menos significativo.fonte
Gelatina , 5 bytes
Experimente online!
fonte
05AB1E ,
65 bytesExperimente online!
fonte
D<
pode ser®
(®
é o padrão-1
).J, 11 bytes
Experimente online!
Obrigado a @JosiahWinslow pelo algoritmo.
Alguma idéia de como reduzir a conversão? Meu pensamento é usar
!.
-fit (nvm, isso apenas altera a tolerância da conversão).O uso de
{
-take é maior em 1 caractere.fonte
Java 8, 101 bytes
Porto de @Oliver resposta Japt 's , com um pouco mais bytes ..;)
Definitivamente, você pode jogar golfe usando uma abordagem matemática em vez dessa abordagem de String.
Explicação:
Experimente aqui.
fonte
R ,
908846 bytesExperimente online!
Implementa o algoritmo de Oliver , mas retorna os dígitos na ordem inversa. Como garantimos que isso
n
nunca é uniforme, o bit menos significativo (o primeiro) é sempre1
, por isso o removemos e anexamos um1
ao final para simular a rotação em R. Agradecemos a Shaggy por me ajudar a corrigir minha matemática .Simplesmente colocar
rev( )
as chamadas de função no rodapé deve retornar os valores na mesma ordem.resposta original, 88 bytes:
Função anônima; retorna os valores na ordem inversa com os nomes das colunas anexados.
Experimente online!
Explicação:
fonte
from the most significant digit to the least significant digit (or in reversed order).
portanto, isso deve ser perfeitamente aceitável.25
, por exemplo, seria[1,1,1,-1,-1]
ou[-1,-1,1,1,1]
.2*bits - 1
vez de1-2*bits
. Obrigado.Perl 5 , 30 bytes
Código de 29 bytes, 1 byte para o
-p
switch.Experimente online!
fonte
CJam, 12 bytes
Um porto da minha resposta Golfscript.
fonte
Ruby ,
44 37 3332 bytesExperimente online!
fonte
Golfscript,
141314 bytes-1 byte porque esqueci que
%
existia. 1 byte porque também esqueci que a entrada é uma string.fonte
{}
para torná-lo um bloco. Programas completos podem receber apenas entradas como strings.{2base{.+(}%\}
de 15 bytes. Da mesma forma, sua resposta CJam.~
.