Convertir de binario a negabinario


15

Dado un entero binario incluido entre 0y 1111111111111111(es decir, un entero sin signo de 16 bits) como entrada, genera el mismo entero en negabinario .

La entrada puede estar en el formato que sea más conveniente para su idioma; por ejemplo, si es más fácil para el programa manejar la entrada con 16 dígitos, como 0000000000000101, en lugar de simplemente 101, puede escribir el programa para aceptar solo la entrada de esa manera.

Muestra de E / S

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

Aquí hay un programa de muestra que escribí que realiza conversiones de bases, incluidas bases negativas y no enteras. Puedes usarlo para verificar tu trabajo.


Solo para aclarar un poco más, la entrada y la salida tendrían que ser binarias, ¿verdad? Quiero decir: cadenas de caracteres de 0sy 1s. Me parece claro, pero una respuesta me hace dudar ligeramente ...
Joanis

@ M.Joanis La entrada es binaria, la salida es negabinaria (que se ve exactamente igual a binaria, una cadena de ceros y unos, pero la forma en que se interpreta el número es diferente).
Peter Olson

2
El enlace parece estar inactivo, lo cual es una razón principal por la cual requerimos que las preguntas sean independientes en estos días
Jo King,

Respuestas:


6

APL, 21 caracteres

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

Usé Dyalog APL para esto, con el ⎕IOconjunto a 0, lo que nos permite indexar matrices que comienzan en 0 en lugar de 1.

Explicación, de derecha a izquierda:

  • nos da la entrada del usuario como un vector de caracteres.
  • ⍎¨aplica la función de ejecución ( ) a cada (¨ ) de los caracteres antes mencionados, lo que da como resultado un vector de enteros 1 y 0.
  • 2⊥ decodifica el vector de la base 2 en decimal.
  • - niega el entero decimal resultante.
  • (16/¯2)⊤codifica el entero decimal en base ¯2(negativo 2). ( 16/¯2replica ¯2,16 tiempos, produciendo 16 dígitos en nuestro número negabinario).
  • - niega cada elemento de nuestro número recién codificado (antes de esto, consiste en -1 y 0), para que podamos usarlo para indexar nuestro vector de caracteres.
  • '01'[ ... ]indexa la matriz de caracteres ( '01') usando los 0 y 1 del vector negabinario negado. Esto es para obtener una salida más bonita.

Ejemplo:

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

4

Ruby, 32 31 caracteres

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

Utiliza el atajo de cálculo negabinario .


La entrada no está codificada. El 0xAAAA no es la entrada, es la máscara la que va a transformar la entrada. 0xAAAA es equivalente a 1010101010101010, que se utiliza en una operación XOR para convertir binario en negabinario. La entrada en sí proviene de la getspalabra clave, que se obtiene de STDIN.
Stefano Diem Benatti

cambió 0xAAAA a 43690 (que es el mismo número en decimal) para disminuir el recuento de caracteres en 1. Sin embargo, hace que sea más difícil entender qué está sucediendo.
Stefano Diem Benatti

Ah bien. No me gusta el rubí, así que no estaba seguro. Lo siento por eso.
Rɪᴋᴇʀ

3

GolfScript, 34 29 27 caracteres

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

Un enfoque sencillo y directo. Es bastante interesante que la versión más corta es la que primero se convierte en número y luego vuelve a la base -2 (al menos la versión más corta que pude encontrar hasta ahora). Pero lo bueno de este es que contiene casi el 15% %.

Edición 1: para la base 2 podemos guardar una operación de módulo y también unir ambos bucles.

Edición 2: Encontré un código aún más corto para convertir una cadena binaria a entero


3

Haskell, 86 83 bytes

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

Llame usando c y luego una matriz entera para dígitos, p. Ej.

c [1,1]

PD: Soy nuevo, ¿lo envié correctamente?

EDITAR: guardé algunos bytes gracias a Laikoni y también arreglé algunos errores tipográficos

EDIT2: Alternativamente, 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 (pero lo llama con una cadena: c "11")


¡Si lo hiciste! Bienvenido al sitio! ¡Espero que te quedes!
Rɪᴋᴇʀ

Bienvenido a PPCG! Puede colocar los paréntesis undigits 2 n, porque la aplicación de función se une más fuerte que la +m. También puede guardar algunos bytes mediante la unión mde un guardia: c n|m<-0xAAAAAAAA= ....
Laikoni

2

Python (2.x), 77 caracteres

(No tan corto como las otras soluciones debido a la necesidad de cambiar manualmente la base ...) Debe satisfacer los requisitos.

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

¡Sugerencias para mejoras adicionales son bienvenidas!

Aliméntelo con valores iniciales como este: 0b1001001


2

JavaScript, 68 bytes

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

Sería 52 bytes en ES6, pero eso es posterior al desafío:

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

2

Jelly , 4 bytes, desafío de fechas posteriores al idioma

Ḅb-2

Pruébalo en línea!

Toma entrada y produce salida, como una lista de dígitos.

Explicación

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

Esto es prácticamente solo una traducción directa de la especificación.


¿No es esto no competitivo? Este desafío es del '11 ...
NoOneIsHere

Me lo perdí. Pondré una nota en el encabezado.

1

k, 17 bytes sin competencia

Algunas de las características utilizadas probablemente sean posteriores al desafío.

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

La entrada es una lista de 1 y 0, y la salida también es una lista de 1 y 0.

Ejemplos del funcionamiento del programa.





0

Japt , 4 bytes

Entrada como una cadena binaria, salida como una matriz de dígitos negabinarios.

Íì2n

Intentalo

O, tomando la entrada como una matriz de dígitos binarios:

ì2JÉ

Intentalo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.