Hintergrund :
Sie haben den Auftrag erhalten, Basis-10-Zahlen in Basis-2 zu konvertieren, ohne vorgefertigte Basis-Konvertierungsfunktionen zu verwenden. Sie können auch keine importierten Bibliotheken verwenden.
Problem :
Konvertiert eine Eingabezeichenfolge von Basis 10 (dezimal) in Basis 2 (binär). Sie dürfen keinen vorgefertigten Code / Funktionen / Methoden für die Basiskonvertierung oder importierte Bibliotheken verwenden. Da es sich um Code-Golf , wird die kürzeste Antwort in Bytes gewinnen.
Die Eingabe erfolgt in einem Bereich von -32768 bis 32767 (einschließlich der Behandlung von Vorzeichenbytes in Ihrem Code).
the MSB of signed variables controls if they are negative
- das klingt wie Vorzeichen, aber wie der Bereich-32768..32767
andeutet, möchten Sie das 2er-Komplement. Also, was willst du? ..Antworten:
GolfScript - 17 Bytes
Nicht zu viel ausführlicher als der eingebaute
~2base
.quelle
~
"37"
, ist die Operation"37" & 1
(im Infix) eine set-weise Operation. Das~
am Anfang wandelt die Eingabe in eine Ganzzahl um.10
auf den Stapel verschoben haben, muss er nicht ausgewertet werden. Beim Lesen vonstdin
ist die Eingabe jedoch eine Zeichenfolge ( hier testen ). In der Problembeschreibung wird auch explizit angegeben, dass die Eingabe eine Zeichenfolge ist.JavaScript, 46
quelle
>>>=
) gibt! +1 (Wenn Sie es in der Konsole ausführen, können Sie auch die letzten 9 Zeichen speichern.)x=8; x>>>=1; x;
undx=8; x>>>1; x;
- im ersten Fall hat sich der Wert von x geändert; im zweiten hat es nicht.>>>=
ist ein einzelner Operator .Brainf * ck,
9877Dies ist natürlich nicht zum Gewinnen gedacht, aber was wäre ein Wettbewerb, wenn es keine Brainfk-Lösung gäbe?
Da brainfk nur mit 8-Bit-Ganzzahlen und keinen Negativen umgehen kann, halte ich mich nicht vollständig an die Regeln, aber hey, ich war nie dabei, um es zu gewinnen.
Dies funktioniert tatsächlich für 16-Bit-Eingaben, wenn Ihr Interpreter dies unterstützt
Ich habe es sogar in ASCII-Werten ausgegeben
Hier ist der kommentierte Code:
Kürzere Algorithmus (77):
Dieser kann nur 8-Bit-Ganzzahlen verarbeiten.
Der Algorithmus arbeitet mit einem Binärzähler, der eigentlich sehr kurz ist (ein Inkrement
>[->]++[-<+]-<-
legt dann die Bits fest. Das Problem ist, dass es schwierig ist, alle Bits auszudruckenDieser letzte Algorithmus kann auf Kosten von Bytes an eine beliebige Anzahl von Bits angepasst werden. Um mit N Bit-Ganzzahlen umgehen zu können, sind zum Codieren 53 + 3 * N Bytes erforderlich.
Beispiele:
quelle
Obligatorische APL-Antwort - 21
22Beispiele:
quelle
⎕IO←0
, und eine Reihe von Bits anstelle einer Zeichenfolge Rückkehr:2|⌊⎕÷2*⊖⍳16
.Turing Machine Code, 272 Byte
Wie üblich verwende ich die hier definierte Regeltabellensyntax. Sie können es auf dieser Site oder alternativ mit dieser Java-Implementierung testen .
Ein Großteil des Codes wurde von meinem Dezimal-Hex-Konverter hier kopiert .
Zählt von der Eingabe in Basis 10 abwärts, während von 0 in Basis 2 aufwärts gezählt wird. Wenn die Null verringert wird, wird der Eingabeblock gelöscht und beendet.
quelle
Javascript 59
quelle
+x
anstelle vonparseInt(x)
Perl, 44
Dies ist mein erstes Perl-Programm überhaupt. Bitte verzeihen Sie mir, wenn dies weiter verbessert werden kann. Edit: Danke @primo, dass du 7 Zeichen von meiner Antwort entfernt hast.
Die Logik ist im Wesentlichen dieselbe wie bei meiner vorherigen C-Lösung.
Verwendet auch 64 Bit.
quelle
reverse
von der Konstruktion der Anordnung nach hinten:@s=($x&1,@s)
.$\=$_%2 .$\while$_=$_>>1||<>;print
. Wenn die Befehlszeilenoptionen jeweils ein Byte zählen, 27:1while$\=$_%2 .$\,$_>>=1}{
using-p
.Javascript -
5648 und3628 ZeichenVielen Dank an @Blender für das Rasieren von 8 Zeichen.
Dieses Formular akzeptiert Eingaben und zeigt Ausgaben mit 48 Zeichen:
Wenn nur eine Anweisung benötigt wird, die eine Variable in
a
der binären Form einer Variablenx
einfügt (und Sie sich nicht darum kümmern, denx
Wert als Nebeneffekt zu zerstören ), ist dies hier eine Anweisung mit 28 Zeichen:quelle
Math.floor
mit~~
, da der Bereich für die Zahlen klein ist.a=x%2+a
könnte dies verkürzt werdena+=x%2
? Es funktioniert in allen Sprachen, die ich kenne.a=a+x%2
, aber das+
ist für die Verkettung von Zeichenfolgen. Dh Ihr Vorschlag ergibt die Ziffern in umgekehrter Reihenfolge.Python -
6160 Zeichenquelle
print
und loswerden""
.print
da es automatisch das ErgebnisC 55 Zeichen
Gibt eine zusätzliche führende Null aus (um 2 Byte zu sparen).
Die Rekursion innerhalb
printf
kehrt die Druckreihenfolge um, sodass der Algorithmus die Bits von rechts nach links extrahiert, aber von links nach rechts druckt.BEARBEITEN : Speichern eines Zeichens mit
putchar
anstelle vonprintf
.quelle
Dyalog APL , 11 Bytes
2|
Der verbleibende Teilungsbetrag, wenn er halbiert ist vom⌊
abgerundeten Wert⎕
der Eingabe÷
geteilt durch2*
zwei zur Potenz von⍳16
{0, 1, 2, ..., 15}Benötigt,
⎕IO←0
was auf vielen Systemen Standard ist.TryAPL online!
quelle
C 81
Die Ausgabe hat ausschließlich 16 Bits (einschließlich Auffüllen von Nullen)
quelle
Apps Script + Google Sheets,
147144121 ByteSkript
Blatt
Geänderte Version dieses Skripts von ZygD.
quelle
Haskell, 66 Bytes
Rufen Sie mit auf
b "-1023"
, fügen Siemain=interact b
ein komplettes Programm hinzu oder probieren Sie es auf Ideon aus.c
Führt die Konvertierung für positive ganze Zahlen durch.b r=show.c.read$r
wandelt einen String in eine Zahl um, wendet ihn anc
und wandelt ihn zurück in einen String. Entferntb('-':r)='-':b r
eine mögliche Führung-
und hängt sie erneut an das Ergebnis an.quelle
PowerShell,
59878270 Byte+28 Bytes zur Unterstützung negativer Zahlen.
-12 Bytes dank nur @ ASCII
Probieren Sie es online!
Angepasst von diesem Code . Übernimmt die Eingabe über einen Befehlszeilenparameter
-d
.quelle
APL (NARS), 17 Zeichen, 34 Byte
Es ist eine Kopie und Modifikation der Antwort von Adam /codegolf//a/90107 in der Weise, wie man den Parameter für die Bitlänge hinzufügen kann und ⎕IO für diese Funktion (hier ist hereIO = 1) sollte habe keine Bedeutung ...
es scheint einfach zu sein, die Anzahl der Bits auf diese Weise zu handhaben (ich habe geprüft, dass das letzte Ergebnis richtig sein sollte)
quelle
Smalltalk (Smalltalk / X), 63/78
Die erste Version erzeugt eine Zwischenzeichenfolge (78):
Tatsächlich ist es nicht erforderlich, die Zeichenfolge zu erstellen. Gib einfach die Zeichen aus (63):
mhmh - gibt es eine kürzere möglichkeit, eine nummer zu lesen?
quelle
Python 3.x: 65 Zeichen
quelle
Bash, 44
Übergeben Sie einen Eingabewert über die Umgebungsvariable an das Skript
n
. Die Dezimaldarstellung des binären Ergebnisses darf nicht überschreitenLONG_MAX
.Dies sollte auch kompatibel mit
ksh93
und sein,zsh
wennb
unde
initialisiert werden0
und eine ordnungsgemäße arithmetische Erweiterung verwendet wird.quelle
n
bereits definiert ist, was es zu einem Snippet macht. Dies kann behoben werden, indem Sie die Eingabe als Befehlszeilenargument verwenden undn
in Ihrem Skript entsprechend festlegen.n=127 sh -c '...'
alssh -c 'n=$1 ...' _ 127
. In diesem Fall gibt es keinen Grund, einander den Vorzug zu geben, da beide die perfekte Art sind, Werte zu übergeben.C # - 104
Diese Methode konvertiert dezimal in binär bis zu
64
Bits .Bei Ausführung der obigen Methode in Linqpad - rr = p (-32768); rr.Dump ();
Ausgabe:
01111111111111111111111111111111111111111111111111000000000000000
quelle
int
.Java 8,
8071 Bytes-9 Bytes aufgrund einer Regel in den Kommentaren. Negative Base-10-Eingänge können anscheinend den positiven / absoluten Base-2-Wert als Ausgabe zurückgeben.
Erläuterung:
Probieren Sie es online aus.
quelle
Kotlin , 82 Bytes
Probieren Sie es online!
quelle
Kleines Basic , 133 Bytes
Ein Skript, das Eingaben von und Ausgaben an die
TextWindow
Konsole ausführt.Probieren Sie es bei SmallBasic.com Benötigt Silverlight und muss daher im IE ausgeführt werden.
I / O wird von der schwarzen Konsole genommen / gegeben.
-22 Bytes dank @Neil
quelle
For i=0To c-1
?MATL ,
15 -17 BytesProbieren Sie es auf MATL Online aus
TIO
(+2 Bytes, wobei führende 0 für negative Zahlen entfernt wird. Das Vorzeichenbit sollte das erste Bit sein.)
Die Ausgabe in MATL Online sollte von unten nach oben gelesen werden (MSB befindet sich unten).
Der Hauptteil ist ziemlich einfach:
`2&\t
= Wenn der Wert größer als 0 ist, dividiere durch 2 und akkumuliere die Reste.Der Umgang mit negativen Zahlen und die Darstellung der 2er-Komplemente war der schwierige Teil. Am Ende ging ich mit dem " subtrahieren aus2N "Methode zum Ermitteln des Zweierkomplements einer Zahl. Da wir nur Werte bis -32768 verarbeiten müssen, erstellt der Code für negative Zahlen 216= 65536 with
16W
, fügt den Eingang zu dem hinzu (zB 65536 + (-42)), was etwas ergibt, das MATLAB als positive Zahl ansieht, aber die vorzeichenbehaftete Binärdarstellung des Eingangs in 16-Bit-Form darstellt.quelle
C (gcc) ,
5043 Bytes-7 bytes dank ceilingcat .
Probieren Sie es online!
quelle
PowerShell , 43 Byte
Probieren Sie es online!
quelle
> <> ,
3433 BytesProbieren Sie es online!
quelle