Converter de binário em negabinário

15

Dado um número inteiro binário inclusive entre 0e 1111111111111111(ou seja, um número inteiro não assinado de 16 bits) como entrada, produza o mesmo número inteiro em negabinário .

A entrada pode estar no formato que for mais conveniente para o seu idioma; por exemplo, se for mais fácil para o programa manipular entradas com 16 dígitos, como 0000000000000101, em vez de simplesmente 101, você pode escrever o programa para aceitar apenas entradas dessa maneira.

E / S de amostra

> 1
1
> 10
110
> 1010
11110
> 110111001111000
11011001110001000
> 1001001
1011001

Aqui está um exemplo de programa que escrevi que baseia conversões, incluindo bases negativas e não inteiras. Você pode usá-lo para verificar seu trabalho.

Peter Olson
fonte
Só para esclarecer um pouco mais, a entrada e a saída teriam que ser binárias, certo? Quero dizer: cadeias de caracteres de 0s e 1s. Looks claro para mim, mas uma resposta me faz duvidar de ânimo leve ...
Joanis
@ M.Joanis A entrada é binária, a saída é negabinary (que parece exatamente o mesmo como binário - uma série de zeros e uns - mas a forma como o número é interpretado é diferente.)
Peter Olson
2
A ligação parece ser baixo, que é a principal razão por que precisamos de perguntas para ser auto-suficiente nos dias de hoje
Jo rei

Respostas:

6

APL, 21 caracteres

'01'[-(16/¯2)⊤-2⊥⍎¨⍞]

Eu usei o Dyalog APL para isso, com ⎕IOdefinido como 0, permitindo indexar matrizes começando em 0 em vez de 1.

Explicação, da direita para a esquerda:

  • nos fornece a entrada do usuário como um vetor de caracteres.
  • ⍎¨aplica a função de execução ( ) a cada ( ¨) dos caracteres acima mencionados, resultando em um vetor de números inteiros 1 e 0.
  • 2⊥ decodifica o vetor da base 2 em decimal.
  • - nega o número inteiro decimal resultante.
  • (16/¯2)⊤codifica o número inteiro decimal na base ¯2(negativo 2). ( 16/¯2replica ¯2, 16vezes, produzindo 16 dígitos em nosso número negativo).
  • - nega cada elemento do nosso número recém-codificado (antes disso, consiste em -1 e 0), para que possamos usá-lo para indexar nosso vetor de caracteres.
  • '01'[ ... ]indexa a matriz de caracteres ( '01') usando os 0 e 1 do vetor negabinário negado. É assim que obtemos uma saída mais bonita.

Exemplo:

      '01'[-(16/¯2)⊤-2⊥⍎¨⍞]
10111010001
0001101011010001
Dillon Cower
fonte
4

Ruby, 32 31 caracteres

m=43690
'%b'%(gets.to_i(2)+m^m)

Usa o atalho de cálculo negativo .

Stefano Diem Benatti
fonte
A entrada não está codificada. O 0xAAAA não é a entrada, é a máscara que transformará a entrada. 0xAAAA é equivalente a 101010101010101010, que é usado em uma operação XOR para converter binário em negabinário. A própria entrada vem da getspalavra - chave, que busca STDIN.
Stefano Diem Benatti 27/03
mudou 0xAAAA para 43690 (que é o mesmo número em decimal) para diminuir a contagem de caracteres em 1. Torna mais difícil entender o que está acontecendo.
Stefano Diem Benatti 27/03
Ah ok. Eu não rubi bom, então eu não tinha certeza. Me desculpe por isso.
Rɪᴋᴇʀ
3

GolfScript, 34 29 27 caracteres

n*~]2base{.2%\(-2/.}do;]-1%

Uma abordagem simples e direta. É bastante interessante que a versão mais curta seja a que primeiro se converte em número e depois volte para a base -2 (pelo menos a versão mais curta que eu poderia encontrar até agora). Mas o bom deste é que ele contém quase 15% %.

Edit 1: Para a base 2, podemos salvar uma operação de módulo e também juntar os dois loops.

Edit 2: Encontrei um código ainda mais curto para converter string binária em número inteiro.

Howard
fonte
3

Haskell, 86 83 bytes

import Data.Bits
import Data.Digits
c n|m<-0xAAAAAAAA=digits 2$xor(unDigits 2 n+m)m

Chame usando ce depois uma matriz inteira para dígitos, por exemplo

c [1,1]

PS: Sou novo, enviei isso corretamente?

Edição: salvou alguns bytes graças a Laikoni e também corrigiu alguns erros de digitação

EDIT2: Como alternativa, c :: String -> String:

import Data.Bits
import Data.Digits
c n|m<-0xAAAAAAAA=concatMap show.digits 2$xor(unDigits 2(map(read.(:[]))n)+m)m

Para 114 bytes (mas você o chama com uma sequência: c "11")

Nome de exibição genérico
fonte
Sim, você fez! Bem vindo ao site! Espero que você fique por aqui!
Rɪᴋᴇʀ
Bem-vindo ao PPCG! Você pode soltar os parênteses undigits 2 n, porque o aplicativo de função se liga mais forte que o +m. Você também pode salvar alguns bytes através da ligação mem um guarda: c n|m<-0xAAAAAAAA= ....
Laikoni 23/03
2

Python (2.x), 77 caracteres

(não tão curto quanto as outras soluções devido à necessidade de alternar manualmente a base ...) Deve atender aos requisitos.

i=input();d=""
while i:i,r=i//-2,i%-2;i+=r<0;d+=`r+[0,2][r<0]`
print d[::-1]

Sugestões para melhorias adicionais são bem-vindas!

Alimente-o com valores iniciais como este: 0b1001001

ChristopheD
fonte
2

JavaScript, 68 bytes

function(b){for(r='',n=parseInt(b,2);r=(n&1)+r,n>>=1;n=-n);return r}

Seriam 52 bytes no ES6, mas isso posterga o desafio:

b=>eval(`for(r='',n=0b${b};r=(n&1)+r,n>>=1;n=-n);r`)
Neil
fonte
2

Geleia , 4 bytes, desafio pós-datas de idiomas

Ḅb-2

Experimente online!

Recebe entrada e produz saída como uma lista de dígitos.

Explicação

Ḅb-2
Ḅ     Convert binary to integer
 b-2  Convert integer to base -2

Isso é basicamente apenas uma tradução direta da especificação.


fonte
Isso não é competitivo? Este desafio é de '11 ... '
NoOneIsHere 22/03
Eu senti falta disso. Vou colocar uma nota no cabeçalho.
1

k, 17 bytes não-concorrentes

Alguns dos recursos usados ​​provavelmente pós-datam o desafio.

1_|2!{_.5+x%-2}\2/

A entrada é uma lista de 1 e 0 e a saída também é uma lista de 1 e 0.

Exemplos do programa funcionando.

zgrep
fonte
0

PHP, 69 bytes

for($i=bindec($argn);$i;$i+=$i%2&$c,$i>>=1,$c^=1)$r=($i%2).$r;echo$r;

Versão Online

Jörg Hülsermann
fonte
0

ES8, 54B

b=>eval`for(r='',n=0b${b};r=(n&1)+r,n>>=1;n=-n);r`
user75200
fonte
0

Japonês , 4 bytes

Entrada como uma seqüência de caracteres binária, saída como uma matriz de dígitos negativos.

Íì2n

Tente

Ou, recebendo a entrada como uma matriz de dígitos binários:

ì2JÉ

Tente

Shaggy
fonte