Konvertiert von binär nach negabinary

15

Wenn Sie eine binäre Ganzzahl einschließlich zwischen 0und 1111111111111111(dh eine 16-Bit-Ganzzahl ohne Vorzeichen) als Eingabe angeben , geben Sie dieselbe Ganzzahl in negabinärer Form aus .

Die Eingabe kann in einem für Ihre Sprache am besten geeigneten Format erfolgen. Wenn es für das Programm beispielsweise einfacher ist, Eingaben mit 16 Ziffern zu verarbeiten, 0000000000000101als einfach 101, können Sie das Programm so schreiben, dass Eingaben nur auf diese Weise akzeptiert werden.

Beispiel-E / A

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

Hier ist ein Beispielprogramm, das ich geschrieben habe und das Basisumwandlungen ausführt, einschließlich negativer und nicht ganzzahliger Basen. Sie können es verwenden, um Ihre Arbeit zu überprüfen.

Peter Olson
quelle
Nur um es etwas näher zu erläutern, müssten Ein- und Ausgabe binär sein, oder? Ich meine: Zeichenketten von 0s und 1s. Sieht für mich klar aus, aber eine Antwort lässt mich leicht zweifeln ...
Joanis
@ M.Joanis Die Eingabe ist binär, die Ausgabe ist negabinär (was genauso aussieht wie binär - eine Folge von Nullen und Einsen - aber die Art und Weise, wie die Zahl interpretiert wird, ist unterschiedlich.)
Peter Olson
2
Der Link scheint nicht zu funktionieren. Dies ist einer der Hauptgründe dafür, warum wir heutzutage verlangen, dass Fragen in sich abgeschlossen sind
Jo King,

Antworten:

6

APL, 21 Zeichen

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

Ich habe dafür Dyalog APL mit dem Wert ⎕IO0 verwendet, um Arrays zu indizieren, die bei 0 anstatt bei 1 beginnen.

Erklärung von rechts nach links:

  • gibt uns die Eingabe des Benutzers als Zeichenvektor.
  • ⍎¨Wendet die Ausführungsfunktion ( ) auf jedes ( ¨) der oben genannten Zeichen an, was zu einem Vektor aus ganzzahligen Einsen und Nullen führt.
  • 2⊥ decodiert den Vektor von der Basis 2 in eine Dezimalzahl.
  • - negiert die resultierende Dezimalzahl.
  • (16/¯2)⊤kodiert die Dezimalzahl in Basis ¯2(negativ 2). ( 16/¯2Replikaten ¯2, 16Zeiten, wodurch man 16 Stellen in unserer negabinary Nummer.)
  • - negiert jedes Element unserer neu codierten Zahl (vorher besteht es aus -1 und 0), damit wir damit unseren Zeichenvektor indizieren können.
  • '01'[ ... ]Indiziert das Zeichenarray ( '01') mit den Nullen und Einsen des negierten Negabinärvektors. Dadurch erhalten wir eine schönere Ausgabe.

Beispiel:

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

Ruby, 32 31 Zeichen

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

Verwendet die Negabinary-Berechnungsverknüpfung .

Stefano Diem Benatti
quelle
Die Eingabe ist nicht fest codiert. Die 0xAAAA ist nicht die Eingabe, sondern die Maske, die die Eingabe transformiert. 0xAAAA entspricht 1010101010101010, das in einer XOR-Operation zum Konvertieren von Binär in Negabinär verwendet wird. Die Eingabe selbst stammt vom getsSchlüsselwort, das von STDIN abgerufen wird.
Stefano Diem Benatti
0xAAAA wurde in 43690 geändert (dies ist die gleiche Dezimalzahl), um die Anzahl der Zeichen um 1 zu verringern. Das Verständnis von wtf wird jedoch erschwert.
Stefano Diem Benatti
Ah, okay. Ich bin mir nicht sicher, ob ich gut rubinrot bin. Das tut mir leid.
27.
3

GolfScript, 34 29 27 Zeichen

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

Ein geradliniger Ansatz. Es ist ziemlich interessant, dass die kürzeste Version diejenige ist, die zuerst in Zahl und dann wieder in Basis -2 konvertiert wird (zumindest die kürzeste Version, die ich bisher finden konnte). Aber das Schöne an diesem ist, dass es fast 15% enthält %.

Edit 1: Für Base 2 können wir eine Modulo-Operation speichern und auch beide Loops verbinden.

Edit 2: Ich habe einen noch kürzeren Code gefunden, um eine Binärzeichenfolge in eine Ganzzahl umzuwandeln.

Howard
quelle
3

Haskell, 86 83 Bytes

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

Rufen Sie mit c und dann ein ganzzahliges Array für Ziffern auf, z

c [1,1]

PS: Ich bin neu, habe ich das richtig eingereicht?

BEARBEITEN: Einige Bytes wurden dank Laikoni gespeichert und einige Tippfehler behoben

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

Für 114 Bytes (aber Sie nennen es mit einem String: c "11")

Generischer Anzeigename
quelle
Ja, das hast du! Willkommen auf der Seite! Hoffe du bleibst dabei!
23.
Willkommen bei PPCG! Sie können die Klammern weglassen undigits 2 n, da die Funktionsanwendung stärker bindet als die +m. Sie können auch durch Bindung einige Bytes speichern min einer Wache: c n|m<-0xAAAAAAAA= ....
Laikoni
2

Python (2.x), 77 Zeichen

(Nicht so kurz wie die anderen Lösungen, da die Basis manuell gewechselt werden muss ...) Sollte die Anforderungen erfüllen.

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

Vorschläge für weitere Verbesserungen sind willkommen!

Füttere es mit folgenden Startwerten: 0b1001001

ChristopheD
quelle
2

JavaScript, 68 Bytes

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

In ES6 wären es 52 Byte, aber das ist die Herausforderung nach dem Datum:

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

Jelly , 4 Bytes, Sprachnachstellung

Ḅb-2

Probieren Sie es online!

Übernimmt die Eingabe und erzeugt die Ausgabe als Ziffernliste.

Erläuterung

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

Dies ist so ziemlich nur eine direkte Übersetzung der Spezifikation.


quelle
Ist das nicht konkurrenzlos? Diese Herausforderung ist von '11 ...
NoOneIsHere
Das habe ich vermisst. Ich werde eine Notiz in die Kopfzeile setzen.
1

k, 17 Bytes nicht konkurrierend

Einige der verwendeten Funktionen stellen die Herausforderung wahrscheinlich nach.

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

Die Eingabe ist eine Liste von Einsen und Nullen, und die Ausgabe ist auch eine Liste von Einsen und Nullen.

Beispiele für das Programm arbeiten.

zgrep
quelle
0

PHP, 69 Bytes

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

Online Version

Jörg Hülsermann
quelle
0

ES8, 54B

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

Japt , 4 Bytes

Eingabe als Binärzeichenfolge, Ausgabe als negabinäres Ziffernfeld.

Íì2n

Versuch es

Oder nehmen Sie die Eingabe als binäres Ziffernfeld:

ì2JÉ

Versuch es

Zottelig
quelle