Ganzzahlige Literale bestehen laut http://en.cppreference.com/w/cpp/language/integer_literal aus einem dezimalen / hexadezimalen / oktalen / binären Literal und einem optionalen ganzzahligen Suffix, das offensichtlich völlig unnötig ist, und wertvolle Bytes verschwendet nicht in dieser Herausforderung verwendet.
Ein Dezimalwörtchen ist a non-zero decimal digit (1, 2, 3, 4, 5, 6, 7, 8, 9), followed by zero or more decimal digits (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
.
Ein oktales Literal ist the digit zero (0) followed by zero or more octal digits (0, 1, 2, 3, 4, 5, 6, 7)
.
Ein hexadezimales Literal ist the character sequence 0x or the character sequence 0X followed by one or more hexadecimal digits (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c, C, d, D, e, E, f, F)
(beachten Sie die Groß- / Kleinschreibung von abcdefx
).
Ein binäres Literal ist the character sequence 0b or the character sequence 0B followed by one or more binary digits (0, 1)
.
Zusätzlich können optional einige '
s als Zifferntrennzeichen vorhanden sein. Sie haben keine Bedeutung und können ignoriert werden.
Eingang
Eine Zeichenfolge, die ein ganzzahliges C ++ 14-Literal oder ein Array seiner Zeichencodes darstellt.
Ausgabe
Die Zahl, die durch die Eingabezeichenfolge in Basis 10 dargestellt wird, mit einer optionalen nachgestellten Newline. Die korrekte Ausgabe wird niemals 2 * 10 ^ 9 überschreiten
Gewinnkriterien
Die GCC-Mitarbeiter benötigen dazu mehr als 500 Codezeilen. Deshalb muss unser Code so kurz wie möglich sein!
Testfälle:
0 -> 0
1 -> 1
12345 -> 12345
12345'67890 -> 1234567890
0xFF -> 255
0XfF -> 255
0xAbCdEf -> 11259375
0xa'bCd'eF -> 11259375
0b1111'0000 -> 240
0b0 -> 0
0B1'0 -> 2
0b1 -> 1
00 -> 0
01 -> 1
012345 -> 5349
0'123'4'5 -> 5349
0
möglicherweise ein guter Testfall (es wurde ein Fehler in einer meiner letzten Überarbeitungen festgestellt).Antworten:
Japt , 6 Bytes
Probieren Sie es online!
quelle
'
von der Eingabe undx86-Computercode (32-Bit)
5957 BytesDiese Funktion nimmt
esi
als Zeiger auf eine nullterminierte Zeichenfolge und gibt den Wert in zurückedx
. (Die folgende Auflistung enthält die GAS-Eingabe in der AT & T-Syntax.)Und eine Zerlegung mit Byteanzahl - diesmal im Intel-Format, falls Sie das vorziehen.
Und für den Fall, dass Sie es versuchen möchten, finden Sie hier den C ++ - Testtreibercode, den ich damit verknüpft habe (einschließlich der Spezifikation der Aufrufkonvention in der GCC-asm-Syntax):
-1 Byte aufgrund eines Kommentars von Peter Cordes
-1 Byte vom Aktualisieren, um mit zwei Dekrementen 10 auf 8 zu ändern
quelle
rdx
und RBX? Then you can use 1-byte
cdq` auf Nullrdx
abeax
.JavaScript (Babel Node) , 26 Byte
lol x2
Probieren Sie es online!
quelle
Number
weil es binär und hex behandelt, aber anscheinend nicht oktalNumber("010") === 10
C ++ (gcc),
141138134120 BytesHierbei handelt es sich um eine Funktion, die ein Array von Zeichen (angegeben als Zeigerpaar zum Anfang und zum Ende - unter Verwendung der beiden Iteratoren) verwendet und die Zahl zurückgibt. Beachten Sie, dass die Funktion das Eingabearray mutiert.
(Dies hängt vom Verhalten von gcc / libstdc ++ ab,
#include<cstdlib>
das die Funktionen auch in den globalen Bereich einordnet . Ersetzen Sie Code, der den strengen Standards entspricht, durch Code,#include<stdlib.h>
der ein weiteres Zeichen kostet.)Kurzbeschreibung: Der Code wird zuerst
std::remove
zum Herausfiltern von'
Zeichen verwendet (ASCII 39). Dannstrtol
mit einer Basis von 0 bereits die Dezimal, Oktal handhaben , und hexadezimal Fällen, so dass der einzige andere Fall zu prüfen , ist ein führender0b
oder0B
und wenn ja, für den Basissatzstrtol
auf 2 und starten , nachdem die führenden 2 Zeichen Parsen.Probieren Sie es online aus.
Sparte 3 Bytes aufgrund des Vorschlags von Ceilingcat und etwas mehr Golfspielen, das folgte.
4 Bytes aufgrund von Vorschlägen von Grastropner gespeichert.
-2 Bytes von Lucas
-12 bytes von l4m2
quelle
#import
anstelle von#include
?0
Python 2 , 32 Bytes
Probieren Sie es online!
lol
(Benötigt Python 2, da Python 3 Oktal-Literale in geändert hat
0o(...)
).quelle
Perl 5 (-p), 14 Bytes
TIO
quelle
R ,
797169 BytesProbieren Sie es online!
strtoi
Tut alles bis auf die Base 2-Konvertierungen und ignoriert die'
, so gibt es ziemlich viele Bytes, nur um diese Dinge zu beheben.Vielen Dank an Aaron Hayman für -6 Bytes und inspirierende -4 weitere Bytes (und das Zählen!)
Überprüfen Sie alle Testfälle (alte Version)
quelle
sub("0b|B"
durch ersetzt wirdsub("b|B"
, da die führende "0" den Wert nicht beeinflusst. Kann eine andere durch Umbenennen bekommenstrtoi
na.omit
zuvor gesehen . Super praktisch hier und ich hab ein bisschen mehr golfen :-)strtoi
eine Binärdatei ist, können Siesubstring
stattdessen Folgendes verwendensub
, um ein weiteres Byte zu speichern: Probieren Sie es online aus!s
Verwendung abstreifensub
statt mitsub('..','',s)
dem ein weiteres Byte kürzer!05AB1E ,
1614 Bytes2 Bytes dank Grimy gespart
Probieren Sie es online! oder als Testsuite
Erläuterung
quelle
0010
).ï
!Excel, 115 Bytes
Eingabe von A1, Ausgabe an die Stelle, an der Sie diese Formel eingeben. Matrixformel, verwenden Sie also Ctrl+ Shift+ Enter, um sie einzugeben.
Ich habe ein paar Testfälle hinzugefügt, die Sie im Bild sehen können. Einige frühe Versuche haben alle angegebenen Testfälle korrekt behandelt, aber die Zeilen 16 und / oder 17 sind falsch.
quelle
x86-64-Maschinencode, 44 Byte
(Der gleiche Maschinencode funktioniert auch im 32-Bit-Modus.)
@Daniel Scheplers Antwort war ein Ausgangspunkt dafür, aber dies hat mindestens eine neue algorithmische Idee (nicht nur besseres Golfen derselben Idee): Die ASCII-Codes für
'B'
(1000010
) und'X'
(1011000
) ergeben nach dem Maskieren mit 16 und 20b0010010
.Nachdem wir also Dezimalstellen (führende Ziffer ungleich Null) und Oktalstellen (Zeichen danach
'0'
ist kleiner als'B'
) ausgeschlossen haben, können wir einfach base = setzenc & 0b0010010
und in die Ziffernschleife springen.Aufrufbar mit x86-64 System V als
unsigned __int128 parse_cxx14_int(int dummy, const char*rsi);
Extrahieren Sie den EDX-Rückgabewert aus der oberen Hälfte desunsigned __int128
Ergebnisses mittmp>>64
.Die geänderten Blöcke gegenüber Daniels Version sind (meistens) weniger eingerückt als andere Anweisungen. Auch die Hauptschleife hat unten ihren bedingten Zweig. Es stellte sich heraus, dass dies eine neutrale Änderung war, da keiner der Pfade in den oberen Bereich fallen konnte
dec ecx / loop .Lentry
Idee, in die Schleife einzutreten, sich nicht als Gewinn herausstellte, nachdem man das Oktal anders gehandhabt hatte. Aber es gibt weniger Anweisungen in der Schleife, wobei die Schleife in der idiomatischen Form do {} while-Struktur ist, also habe ich sie beibehalten.Daniels C ++ - Test-Harness funktioniert mit diesem Code unverändert im 64-Bit-Modus. Dabei wird dieselbe Aufrufkonvention wie bei seiner 32-Bit-Antwort verwendet.
Demontage, einschließlich der Maschinencode-Bytes, die die eigentliche Antwort sind
Andere Änderungen von Daniels Version beinhalten das Speichern des Codes
sub $16, %al
aus der Ziffernschleife heraus, indem mehrsub
anstelle von verwendet wirdtest
als Teil der Erfassungs Separatoren und Ziffern vs. alphabetischen Zeichen.Im Gegensatz zu Daniel wird jedes Zeichen
'0'
als Trennzeichen behandelt, nicht nur'\''
. (Außer' '
:and $~32, %al
/jnz
in beiden Schleifen wird das Leerzeichen als Abschlusszeichen behandelt, was möglicherweise zum Testen mit einer Ganzzahl am Zeilenanfang nützlich ist.)Jede Operation, die
%al
innerhalb der Schleife geändert wird, weist Verzweigungsverbrauchsflags auf, die vom Ergebnis gesetzt werden, und jede Verzweigung wird an eine andere Position verschoben (oder fällt durch).quelle
eax
Benötigen Sie überhaupt die Initialisierung , dass AIUI im 64-Bit-Modus Opcodes mit kleinem Ziel die höheren Bits auf 0 zurücksetzt?setcc r/m8
insetcc r/m32
, so dass wir immer noch eine dumme 2-Befehl benötigenxor
-Nullsignal / set flags /setcc %al
Sequenz eine 32/64-Bit erstellen 0 oder 1 Variable, und es benötigt das Nullregister vor dem Setzen des Flags. (Oder verwenden Siemov $0, %eax
stattdessen odermovzx
auf dem kritischen Pfad).Netzhaut 96 Bytes
Probieren Sie es online! Link enthält Testsuite. Erläuterung:
Löschen Sie
'
s und konvertieren Sie alles in Kleinbuchstaben.Trennen Sie die Ziffern, da Hexadezimalzahlen in Dezimalzahlen umgewandelt werden müssen.
Identifizieren Sie die Basis der Nummer.
Wandle die Zeichen
a-g
in Zahlen um10-16
.Führen Sie eine Basiskonvertierung für die Ziffernliste durch.
$.($`*$1*_*$2*
ist kurz für$.($`*$1*_*$2*_)
welche multipliziert$`
und$1
zusammen und addiert$2
. ($`
Ist der Teil der Zeichenkette vor;
der Basis.)Löschen Sie die Basis.
quelle
J , 48 Bytes
Probieren Sie es online!
Auswertung nach String-Ersetzung.
quelle
0b
: tio.run/##FcwxCsIwFAbg/…Perl 6 , 29 Bytes
Probieren Sie es online!
Perl 6 erfordert ein explizites
0o
Präfix für Oktal und unterstützt keine Präfixe in Großbuchstaben wie0X
.Erläuterung
quelle
Oktave ,
292120 BytesProbieren Sie es online!
-8 Bytes dank @TomCarpenter
quelle
@(x)str2num(x(x~="'"))
@(x)str2num(x(x~=39))
f=("077")
kehrt zum Beispiel zurück,ans = 77
wenn es 63 sein sollte. Oder, wie im Testfall in OP,f=("012345")
sollte es stattdessen 5349 zurückgebenans = 12345
Bash, 33 Bytes
TIO
Zsh,
2927 Bytes-2 Bytes dank @GammaFunction
TIO
quelle
setopt octalzeroes
wäre für Zsh notwendig.<<<$[...]
anstelle vonecho $[...]
Geh, 75
quelle
JavaScript (ES6), 112 Byte
quelle
Gelee , 27 Bytes
Probieren Sie es online!
Fast alles davon ist Umgang mit Oktal. Ich glaube, es könnte besser sein, Golf zu spielen.
quelle
Ruby mit
-n
17 BytesEinfach in den
eval
Zug springen , wirklich.Probieren Sie es online!
quelle
Java (JDK) , 101 Byte
Probieren Sie es online!
Long.decode
befasst sich mit allen Arten von Literalen mit Ausnahme der binären.Vorlage aus Benjamins Antwort entlehnt
quelle
C (GCC) ,
120118 Bytes-1 byte dank ceilingcat
Probieren Sie es online!
quelle
C (gcc)
1019783 BytesProbieren Sie es online aus
quelle
PHP - 43 Byte
Gleiche Methode wie https://codegolf.stackexchange.com/a/185644/45489
quelle
C ++, G ++, 189 Bytes
Keine Notwendigkeit für Tests
Erfordert die Installation von
g++
mit C ++ 14-UnterstützungNun zu den Erklärungen:
quelle
Pyth , 27 Bytes
Probieren Sie es online!
Im Gegensatz zur vorherigen (jetzt gelöschten) Pyth-Antwort besteht diese alle Testfälle in der Frage, obwohl sie 3 Byte länger ist.
quelle
C (gcc) / Bash / C ++, 118 Bytes
Probieren Sie es online!
quelle
popen
undsystem
. Ich denke-x
, G ++ hat ein Flag , das man aus stdin lesen kann. Das ist vielleicht kürzer als offenes Zeug, aber ich weiß nicht, wie ich mit stdin in C aufrufen sollpopen
Befehl zusammengeführtprintf
->echo
scheint zu funktionieren. Sie werden bald in Bash programmieren.Java,
158 bis154 BytesDas wartet nur darauf, übervorteilt zu werden. Versucht nur reguläre Ausdrücke, bis etwas funktioniert, und verwendet standardmäßig Hex.
-4 Bytes dank @ValueInk
Probieren Sie es online aus
Mit ScriptEngine
9287 BytesEval Zug kommt durch. Technisch gesehen reicht das die Fackel an JS weiter, es ist also nicht meine Hauptaufgabe.
TIO
quelle
[bBxX]
und0[bB].+
für einige schnelle Regex-Optimierungen.0x9999999999
)Long
anstattInteger
für Golf Zwecke. Wenn Sie korrekt sind, kann Python auch nicht mithalten, da es über Ganzzahlen mit willkürlicher Genauigkeit verfügt. Außerdem ist along
in Java eine Ganzzahl, die mit 64 Bits anstelle von 32 dargestellt wird. Es gibt keine Dezimalstellen.The correct output never will exceed 2*10^9
Sie besagt ganz klar, dass lange nicht alleine verwendet werden kann, weil ich es geben kann0x9999999999
und es eine Zahl hervorbringen wird höher als 2 * 10 ^ 9, während C ++ ein Speicherüberlaufproblem verursachen würde, da Sie mehr als 32 Bit im Speicher verwenden, wenn Sie dieser Nummer nur 32 Bit Speicher zugewiesen haben