Converti da binario a negabinario


15

Dato un intero binario inclusivamente compreso tra 0e 1111111111111111(ovvero un intero senza segno a 16 bit) come input, emette lo stesso numero intero in negabinary .

L'input può essere in qualsiasi formato più conveniente per la tua lingua; ad esempio, se è più facile per il programma gestire l'input con 16 cifre, come 0000000000000101, piuttosto che semplicemente 101, è possibile scrivere il programma per accettare l'input solo in quel modo.

I / O di esempio

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

Ecco un programma di esempio che ho scritto che esegue conversioni di base, incluse basi negative e non intere. Puoi usarlo per controllare il tuo lavoro.


Giusto per chiarire un po 'di più, l'input e l'output dovrebbero essere binari, giusto? Voglio dire: stringhe di caratteri di 0s e 1s. Mi sembra chiaro, ma una risposta mi fa dubitare leggermente ...
— Joanis,

@ M.Joanis L'input è binario, l'output è negabinario (che è esattamente uguale al binario - una stringa di zero e uno - ma il modo in cui il numero viene interpretato è diverso.)
— Peter Olson

2
Il collegamento sembra essere inattivo, che è una delle ragioni principali per cui in questi giorni abbiamo bisogno di domande autosufficienti
— Jo King,

Risposte:


6

APL, 21 caratteri

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

Ho usato Dyalog APL per questo, con ⎕IOset su 0, permettendoci di indicizzare le matrici a partire da 0 anziché da 1.

Spiegazione, da destra a sinistra:

  • ⍞ ci fornisce l'input dell'utente come vettore di caratteri.
  • ⍎¨applica la funzione di esecuzione ( ⍎) a ciascuno ( ¨) dei suddetti caratteri, risultando in un vettore di numeri interi 1 e 0.
  • 2⊥ decodifica il vettore dalla base 2 in decimale.
  • - nega il numero intero decimale risultante.
  • (16/¯2)⊤codifica il numero intero decimale in base ¯2(negativo 2). ( 16/¯2replica ¯2, 16volte, producendo 16 cifre nel nostro numero negativo).
  • - annulla ogni elemento del nostro numero appena codificato (prima di questo, è costituito da -1 e 0), in modo che possiamo usarlo per indicizzare il nostro vettore di caratteri.
  • '01'[ ... ]indicizza la matrice di caratteri ( '01') usando gli 0 e 1 del vettore negabinario negato. Questo è così otteniamo un risultato più bello.

Esempio:

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

4

Rubino, 32 31 caratteri

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

Utilizza il collegamento di calcolo negabinary .


L'ingresso non è hard coded. Lo 0xAAAA non è l'input, è la maschera che trasformerà l'input. 0xAAAA è equivalente a 1010101010101010, che viene utilizzato in un'operazione XOR per convertire il binario in negabinary. L'input stesso proviene dalla getsparola chiave, che recupera da STDIN.
— Stefano Diem Benatti,

modificato da 0xAAAA a 43690 (che è lo stesso numero in decimali) per ridurre il conteggio dei caratteri di 1. Rende tuttavia più difficile capire che cosa sta accadendo.
— Stefano Diem Benatti,

Ah ok. Non rubino bene, quindi non ne ero sicuro. Mi dispiace per quello.
— R

3

GolfScript, 34 29 27 caratteri

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

Un approccio semplice e diretto. È abbastanza interessante che la versione più corta sia quella che prima converte in numero e poi di nuovo in base -2 (almeno la versione più corta che ho trovato fino ad ora). Ma la cosa bella di questo è che contiene quasi il 15% %.

Modifica 1: per la base 2 possiamo salvare un'operazione modulo e anche unire entrambi i loop.

Modifica 2: ho trovato un codice ancora più breve per convertire la stringa binaria in numero intero.


3

Haskell, 86 83 byte

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

Chiamare usando c e quindi un array intero per le cifre, ad es

c [1,1]

PS: sono nuovo, l'ho inviato correttamente?

EDIT: salvato alcuni byte grazie a Laikoni e risolto anche alcuni errori di battitura

EDIT2: in 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

Per 114 byte (ma lo chiami con una stringa: c "11")


Sì, l'hai fatto! Benvenuti nel sito! Spero che rimani in giro!
— Rɪᴋᴇʀ

Benvenuti in PPCG! È possibile rilasciare le parentesi undigits 2 nperché l'applicazione della funzione si lega più forte di +m. È inoltre possibile salvare alcuni byte legandosi min una guardia: c n|m<-0xAAAAAAAA= ....
— Laikoni,

2

Python (2.x), 77 caratteri

(non breve come le altre soluzioni a causa della necessità di cambiare manualmente la base ...) Dovrebbe soddisfare i requisiti.

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

Suggerimenti per ulteriori miglioramenti sono benvenuti!

Alimentalo con valori iniziali come questo: 0b1001001


2

JavaScript, 68 byte

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

Sarebbero 52 byte in ES6, ma questo post-date la sfida:

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

2

Gelatina , 4 byte, sfida post-lingua in lingua

Ḅb-2

Provalo online!

Accetta input e produce output, come un elenco di cifre.

Spiegazione

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

Questa è praticamente solo una traduzione diretta delle specifiche.


Questo non è in competizione? Questa sfida è del '11 ...
— NoOneIsHere il

Ho perso questo. Metterò una nota nell'intestazione.

1

k, 17 byte non competitivi

Alcune delle funzionalità utilizzate probabilmente hanno superato la sfida.

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

L'input è un elenco di 1 e 0 e anche un elenco di 1 e 0.

Esempi di funzionamento del programma.



0

ES8, 54B

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


0

Japt , 4 byte

Input come stringa binaria, output come array di cifre negabinary.

Íì2n

Provalo

Oppure, prendendo input come un array di cifre binarie:

ì2JÉ

Provalo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.