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.