Antecedentes :
Você recebeu uma atribuição para converter números da base 10 em base 2 sem usar nenhuma função de conversão de base pré-fabricada. Você também não pode usar nenhuma biblioteca importada.
problema :
Converta uma sequência de entrada da base 10 (decimal) para a base 2 (binária). Você não pode usar nenhum código / função / conversão de base pré-fabricado ou bibliotecas importadas. Como esse é o código-golfe , a resposta mais curta em bytes será vencedora.
A entrada será algo entre -32768 e 32767 (inclua manipulação de byte de sinal no seu código)
the MSB of signed variables controls if they are negative
- isso soa como bit de sinal; no entanto, como o intervalo-32768..32767
sugere, você deseja o complemento de 2. Assim que você quer ..?Respostas:
GolfScript - 17 bytes
Não é muito mais detalhado do que o incorporado
~2base
.fonte
~
"37"
, por exemplo, a operação"37" & 1
(em infixo) é uma operação em conjunto. O~
na frente converte a entrada em um número inteiro.10
na pilha, não é necessário avaliá-lo. No entanto, quando lidastdin
, a entrada será uma string ( teste aqui ). A descrição do problema também afirma explicitamente que a entrada é uma sequência.JavaScript, 46
fonte
>>>=
existia um operador de 4 caracteres ( )! +1 (Além disso, se você o executar no console, poderá salvar os últimos 9 caracteres.)x=8; x>>>=1; x;
ex=8; x>>>1; x;
- no primeiro caso, o valor de x mudou; no segundo, não tem.>>>=
é um único operador .Brainf * ck,
9877Obviamente, isso não tem o objetivo de vencer, mas o que seria uma competição se não tivesse uma solução brainfk
Como brainfk só pode lidar com números inteiros de 8 bits e sem negativos, acho que não cumpre totalmente as regras, mas ei, eu nunca estive nele para vencê-lo.
Na verdade, isso funciona para entrada de 16 bits se o seu intérprete suportar
Eu até consegui produzir valores ASCII
Aqui está o código anotado:
Algoritmo mais curto (77):
Este pode lidar apenas com números inteiros de 8 bits.
O algoritmo funciona usando um contador binário que é realmente muito curto (um incremento é o
>[->]++[-<+]-<-
que distribui os bits. O problema é que é difícil imprimir todos os bitsEsse último algoritmo pode ser adaptado para caber em qualquer número de bits à custa de bytes. Para poder lidar com números inteiros de N bits, são necessários 53 + 3 * N bytes para codificar.
exemplos:
fonte
Resposta APL obrigatória - 21
22Exemplos:
fonte
⎕IO←0
, e retornando uma matriz de bits em vez de uma string:2|⌊⎕÷2*⊖⍳16
.Código da máquina de Turing, 272 bytes
Como sempre, estou usando a sintaxe da tabela de regras definida aqui. Você pode testá-lo nesse site ou, alternativamente, usando esta implementação java.
Muito do código é copiado do meu conversor de decimal para hexadecimal aqui.
Faz a contagem regressiva da entrada na base 10 e conta a partir de 0 na base 2. Ao diminuir o zero, apaga o bloco de entrada e termina.
fonte
Javascript 59
fonte
+x
vez deparseInt(x)
Perl, 44
Este é o meu primeiro programa Perl de todos os tempos, então, por favor, perdoe-me se isso puder ser facilitado ainda mais. Edit: Obrigado @primo por tirar 7 caracteres da minha resposta.
A lógica é essencialmente a mesma que a minha solução C anterior.
Além disso, usa 64 bits.
fonte
reverse
construindo as para trás da matriz:@s=($x&1,@s)
.$\=$_%2 .$\while$_=$_>>1||<>;print
. Ou, se as opções de linha de comando contarem um byte cada, 27:1while$\=$_%2 .$\,$_>>=1}{
using-p
.Javascript -
5648 e3628 caracteresGraças ao @Blender por cortar 8 caracteres.
Este formulário recebe entrada e mostra a saída, 48 caracteres:
Se apenas uma instrução que coloca em uma variável
a
a forma binária de uma variávelx
é necessária (e você não se preocupa em destruir ox
valor como efeito colateral), aqui está ela com 28 caracteres:fonte
Math.floor
por~~
, pois o intervalo para os números é pequeno.a=x%2+a
que isso pode ser reduzido paraa+=x%2
? Funciona em todos os idiomas que conheço.a=a+x%2
, mas isso+
é para concatenação de strings. Ou seja, sua sugestão resulta nos dígitos na ordem inversa.Python -
6160 caracteresfonte
print
e""
.print
como ele automaticamente retorna o resultadoC, 55 caracteres
Imprime um zero inicial extra (por uma questão de 2 bytes).
Como a recursão
printf
inverte a ordem de impressão, o algoritmo extrai os bits da direita para a esquerda, mas imprime da esquerda para a direita.EDIT : salvou um char usando em
putchar
vez deprintf
.fonte
Dyalog APL , 11 bytes
2|
O restante da divisão, quando dividido pela metade do⌊
valor arredondado da⎕
entrada÷
dividido por cada um de2*
dois, à potência de cada um de⍳16
{0, 1, 2, ..., 15}Requer
⎕IO←0
qual é o padrão em muitos sistemas.TryAPL online!
fonte
C, 81
A saída possui estritamente 16 bits (incluindo zeros de preenchimento)
fonte
Script do Google Apps + Planilhas Google,
147144121 bytesRoteiro
Folha
Versão modificada deste script por ZygD.
fonte
Haskell, 66 bytes
Ligue para
b "-1023"
, adicionemain=interact b
um programa completo ou experimente o Ideon.c
realiza a conversão para números inteiros positivos.b r=show.c.read$r
converte uma string em um número, aplicac
e converte novamente em string.b('-':r)='-':b r
retira uma possível liderança-
e a anexa novamente ao resultado.fonte
PowerShell,
59878270 bytes+28 bytes para suportar números negativos.
-12 bytes graças a @ ASCII-only
Experimente online!
Adaptado deste código . Recebe entrada através de um parâmetro de linha de comando
-d
.fonte
APL (NARS), 17 caracteres, 34 bytes
É uma cópia e modificação da resposta de Adam /codegolf//a/90107 da maneira que se pode adicionar o parâmetro para o comprimento dos bits e ⎕IO para esta função (aqui ⎕IO = 1) deve não tem importância ...
parece fácil lidar com o número de bits dessa maneira (chequei o último resultado certo)
fonte
Smalltalk (Smalltalk / X), 63/78
a primeira versão cria uma cadeia intermediária (78):
na verdade, não há necessidade de criar a string; basta imprimir os caracteres (63):
mhmh - existe uma maneira mais curta de ler para um número?
fonte
Python 3.x: 65 caracteres
fonte
Bash, 44
Passe um valor de entrada para o script através da variável de ambiente
n
. A representação decimal do resultado binário não pode excederLONG_MAX
.Isso também deve ser compatível com
ksh93
ezsh
, seb
ee
são inicializados para0
e expansão aritmética adequada for utilizada.fonte
n
já está definido, tornando-o um snippet. Isso pode ser corrigido usando a entrada como argumento da linha de comando e definindon
isso no seu script.n=127 sh -c '...'
quesh -c 'n=$1 ...' _ 127
. Não há razão para preferir um ao outro nesse caso, pois ambos são uma maneira perfeitamente típica de passar valores.C # - 104
Este método converterá decimal em binário em
64
bits.Quando executado, o método acima no Linqpad - rr = p (-32768); rr.Dump ();
Resultado:
01111111111111111111111111111111111111111111111111000000000000000
fonte
int
.Java 8,
8071 bytes-9 bytes devido a uma regra nos comentários. As entradas negativas da base 10 podem retornar o valor positivo / absoluto da base 2 como saída aparentemente.
Explicação:
Experimente online.
fonte
Kotlin , 82 bytes
Experimente online!
fonte
Pequeno Básico , 133 bytes
Um script que entra e sai para o
TextWindow
console.Experimente em SmallBasic.com Requer o Silverlight e, portanto, deve ser executado no IE.
A E / S é obtida / fornecida no console preto.
-22 bytes graças a @Neil
fonte
For i=0To c-1
?MATL ,
1517 bytesExperimente no MATL Online
TIO
(+2 bytes removendo 0 inicial para números negativos, o bit de sinal deve ser o primeiro bit.)
A saída no MATL Online deve ser lida de baixo para cima (MSB está na parte inferior).
A parte principal é bem simples:
`2&\t
= enquanto o valor for maior que 0, divida por 2 e acumule os restantes.Lidar com números negativos e dar-lhes a representação do complemento de 2 foi a parte complicada. No final, eu fui com o " subtrair de2N "para obter o complemento de dois de um número. Como somos obrigados a manipular valores de até -32768, para números negativos, o código cria 216= 65536 com
16W
, adiciona a entrada a isso (por exemplo, 65536 + (-42)), que fornece algo que o MATLAB vê como um número positivo, mas representa a representação binária assinada da entrada na forma de 16 bits.fonte
C (gcc) ,
5043 bytes-7 bytes graças ao ceilingcat .
Experimente online!
fonte
PowerShell , 43 bytes
Experimente online!
fonte
> <> ,
3433 bytesExperimente online!
fonte