Zgodnie z http://en.cppreference.com/w/cpp/language/integer_literal literały liczb całkowitych składają się z literału dziesiętnego / szesnastkowego / ósemkowego / binarnego i opcjonalnego sufiksu liczb całkowitych, który jest oczywiście całkowicie niepotrzebny, marnuje cenne bajty i jest niewykorzystane w tym wyzwaniu.
Dziesiętny dosłowny to 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)
.
Oktalowy literał to the digit zero (0) followed by zero or more octal digits (0, 1, 2, 3, 4, 5, 6, 7)
.
Literał szesnastkowy to 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)
(zwróć uwagę na niewrażliwość na wielkość liter abcdefx
).
Binarny literał to the character sequence 0b or the character sequence 0B followed by one or more binary digits (0, 1)
.
Dodatkowo, opcjonalnie mogą występować pewne '
s jako separator cyfr. Nie mają znaczenia i można je zignorować.
Wkład
Ciąg znaków reprezentujący literał całkowity C ++ 14 lub tablicę jego znaków.
Wydajność
Liczba reprezentowana przez łańcuch wejściowy w podstawie 10, z opcjonalnym końcowym znakiem nowej linii. Prawidłowa moc wyjściowa nigdy nie przekroczy 2 * 10 ^ 9
Kryteria wygranej
Współpracownicy GCC potrzebują do tego ponad 500 linii kodu, dlatego nasz kod musi być możliwie jak najkrótszy!
Przypadki testowe:
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
może być dobrym przypadkiem testowym do dodania (ujawnił błąd w jednej z moich ostatnich wersji).Odpowiedzi:
Japt , 6 bajtów
Wypróbuj online!
źródło
'
z danych wejściowych, a następnie oceniam je jako Jskod maszynowy x86 (32-bit),
5957 bajtówTa funkcja przyjmuje
esi
wskaźnik jako łańcuch zakończony znakiem null i zwraca wartość wedx
. (Poniżej wymieniono dane wejściowe GAS w składni AT&T.)I liczy się demontaż z bajtami - tym razem w formacie Intela, na wypadek, gdybyś wolał ten.
A jeśli chcesz go wypróbować, oto kod sterownika testowego C ++, który z nim powiązałem (łącznie ze specyfikacją konwencji wywoływania w składni asm GCC):
-1 bajt z powodu komentarza Petera Cordesa
-1 bajt od aktualizacji do użycia dwóch dekrementów do zmiany 10 na 8
źródło
rdx
i rbx? Then you can use 1-byte
cdq` na zerordx
zeax
.JavaScript (węzeł Babel) , 26 bajtów
lol x2
Wypróbuj online!
źródło
Number
ponieważ obsługuje binarne i szesnastkowe, ale najwyraźniej nie ósemkoweNumber("010") === 10
C ++ (gcc),
141138134120 bajtówJest to funkcja, która przenosi tablicę znaków (określoną jako parę wskaźników na początek i na koniec - używając pary idiomów iteratorów) i zwraca liczbę. Zauważ, że funkcja mutuje tablicę wejściową.
(Zależy to od zachowania gcc / libstdc ++, które
#include<cstdlib>
również umieszcza funkcje w zasięgu globalnym. W przypadku kodu ściśle zgodnego ze standardem zamień#include<stdlib.h>
na na koszt jeszcze jednego znaku.)Krótki opis: kod najpierw wykorzystuje
std::remove
do odfiltrowywania'
znaków (ASCII 39). Następniestrtol
na bazie 0 będzie już obsługiwać po przecinku, ósemkowy i przypadki szesnastkowym, więc jedyna inna sprawa do sprawdzenia jest wiodącym0b
czy0B
, a jeśli tak, to ustawić bazę dostrtol
do 2 i zacząć parsowania po czołowych 2 znaki.Wypróbuj online.
Zaoszczędzono 3 bajty dzięki sugestii sufitowego kota i późniejszej grze w golfa.
Zapisano 4 bajty dzięki sugestiom grastropner.
-2 bajty autorstwa Lucasa
-12 bajtów na l4m2
źródło
#import
zamiast#include
?0
dla podstawy 2Python 2 , 32 bajty
Wypróbuj online!
lol
(wymaga Python 2, ponieważ Python 3 zmienił literał ósemkowy na
0o(...)
).źródło
Perl 5 (-p), 14 bajtów
TIO
źródło
R ,
797169 bajtówWypróbuj online!
strtoi
robi wszystko oprócz konwersji podstawowych 2 i ignorowanie'
, więc jest całkiem sporo bajtów tylko po to, żeby to naprawić.Podziękowania dla Aarona Haymana za -6 bajtów i inspirowanie -4 dodatkowych bajtów (i wciąż rośnie!)
Sprawdź wszystkie przypadki testowe (stara wersja)
źródło
sub("0b|B"
zsub("b|B"
, od wiodącego „0” nie będzie miało wpływu na wartości. Można uzyskać inną, zmieniając nazwęstrtoi
na.omit
. Bardzo przydatny tutaj, a ja grałem w golfa trochę więcej :-)strtoi
jest binarna, możesz użyćsubstring
zamiastsub
zapisać kolejny bajt: Wypróbuj online!s
używającsub
zamiast tego,sub('..','',s)
który jest kolejnym bajtem krótszym!05AB1E ,
1614 bajtówZaoszczędzono 2 bajty dzięki Grimy
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
0010
.).ï
!Excel, 115 bajtów
Dane wejściowe z A1, dane wyjściowe do każdego miejsca, w którym umieścisz ten wzór. Formuła tablicowa, więc użyj Ctrl+ Shift+, Enteraby ją wprowadzić.
Dodałem kilka przypadków testowych, które można zobaczyć na obrazku - niektóre wczesne próby poprawnie obsługiwały wszystkie podane przypadki testowe, ale błędne były wiersze 16 i / lub 17.
źródło
kod maszynowy x86-64, 44 bajty
(Ten sam kod maszynowy działa również w trybie 32-bitowym.)
Odpowiedź @Daniela Scheplera była punktem wyjścia do tego, ale ma to co najmniej jeden nowy algorytmiczny pomysł (nie tylko lepszą grę w golfa tego samego pomysłu): kody ASCII dla
'B'
(1000010
) i'X'
(1011000
) dają 16 i 2 po maskowaniu0b0010010
.Więc po wykluczeniu dziesiętnej (niezerowej cyfry wiodącej) i ósemkowej (char after
'0'
jest mniejsza niż'B'
), możemy po prostu ustawić base =c & 0b0010010
i przejść do pętli cyfr.Można wywoływać za pomocą x86-64 System V as
unsigned __int128 parse_cxx14_int(int dummy, const char*rsi);
Wyodrębnij wartość zwracaną EDX z górnej połowyunsigned __int128
wyniku za pomocątmp>>64
.Zmienione bloki vs. wersja Daniela są (głównie) wcięte mniej niż inne instrukcje. Również główna pętla ma u dołu gałąź warunkową. Okazało się to neutralną zmianą, ponieważ żadna ścieżka nie mogła wpaść na sam szczyt, a
dec ecx / loop .Lentry
pomysł wejścia do pętli okazał się nie być wygraną po różnym potraktowaniu ósemki. Ale ma mniej instrukcji wewnątrz pętli z pętlą w formie idiomatycznej do {} podczas tworzenia struktury, więc ją zachowałem.Wiązka testowa Daniela C ++ Daniela działa bez zmian w trybie 64-bitowym z tym kodem, który wykorzystuje tę samą konwencję wywoływania jak jego 32-bitowa odpowiedź.
Demontaż, w tym bajty kodu maszynowego, które są rzeczywistą odpowiedzią
Inne zmiany w porównaniu z wersją Daniela obejmują zapisywanie
sub $16, %al
od wewnątrz pętli cyfr, poprzez użycie więcejsub
zamiast wtest
ramach wykrywania separatorów oraz cyfr w porównaniu ze znakami alfabetycznymi.W przeciwieństwie do Daniela każda postać poniżej
'0'
jest traktowana jako separator, nie tylko'\''
. (Z wyjątkiem' '
:and $~32, %al
/jnz
w obu naszych pętlach traktuje spację jako terminator, co jest prawdopodobnie wygodne do testowania za pomocą liczby całkowitej na początku linii.)Każda operacja, która modyfikuje się
%al
w pętli, ma gałąź używającą flagi ustawioną przez wynik, a każda gałąź przechodzi (lub spada) w inne miejsce.źródło
eax
biorąc pod uwagę, że AIUI w trybach 64-bitowych z kodami małych miejsc docelowych zresetuje wyższe bity na 0?setcc r/m8
wsetcc r/m32
, więc nadal potrzebujemy głupiej 2-instrukcjixor
-zero / set flags /setcc %al
sekwencja, aby utworzyć 32/64-bit 0 lub 1 zmienna i potrzebuje zerowanego rejestru przed ustawieniem flagi. (Lub użyjmov $0, %eax
zamiast lub użyjmovzx
na ścieżce krytycznej).Siatkówka , 96 bajtów
Wypróbuj online! Link zawiera pakiet testowy. Wyjaśnienie:
Usuń
'
s i przekonwertuj wszystko na małe litery.Rozdziel cyfry, ponieważ wszystkie cyfry szesnastkowe muszą zostać przeliczone na dziesiętne.
Zidentyfikuj podstawę liczby.
Konwertuj znaki
a-g
na liczby10-16
.Wykonaj konwersję podstawową na liście cyfr.
$.($`*$1*_*$2*
jest skrótem, dla$.($`*$1*_*$2*_)
którego mnoży się$`
i$1
razem i dodaje$2
. ($`
jest częścią ciągu przed;
ie bazą).Usuń bazę.
źródło
J , 48 bajtów
Wypróbuj online!
Eval po podstawieniu łańcucha.
źródło
0b
: tio.run/##FcwxCsIwFAbg/…Perl 6 , 29 bajtów
Wypróbuj online!
Perl 6 wymaga jawnego
0o
przedrostka ósemkowego i nie obsługuje takich jak przedrostek wielkich liter0X
.Wyjaśnienie
źródło
Oktawa ,
292120 bajtówWypróbuj online!
-8 bajtów dzięki @TomCarpenter
źródło
@(x)str2num(x(x~="'"))
@(x)str2num(x(x~=39))
f=("077")
zwraca,ans = 77
gdy powinien wynosić 63. Lub, jak w przypadku testowym w OP,f=("012345")
powinien zwracać 5349, ale zamiast tegoans = 12345
Bash, 33 bajty
TIO
Zsh,
2927 bajtów-2 bajty dzięki @GammaFunction
TIO
źródło
setopt octalzeroes
będzie to konieczne dla Zsh.<<<$[...]
zamiast zamiastecho $[...]
Idź, 75
źródło
JavaScript (ES6), 112 bajtów
źródło
Galaretka , 27 bajtów
Wypróbuj online!
Prawie wszystko to dotyczy obsługi ósemkowej. Wydaje się, że można lepiej grać w golfa.
źródło
Ruby z
-n
, 17 bajtówNaprawdę po prostu wskakuję do
eval
pociągu.Wypróbuj online!
źródło
Java (JDK) , 101 bajtów
Wypróbuj online!
Long.decode
zajmuje się wszelkiego rodzaju literałami oprócz binarnych.Szablon zapożyczony z odpowiedzi Benjamina
źródło
C (gcc) ,
120118 bajtów-1 bajt dzięki pułapkowi cat
Wypróbuj online!
źródło
C (gcc),
1019783 bajtówWypróbuj online
źródło
PHP - 43 bajty
Ta sama metoda, co /codegolf//a/185644/45489
źródło
C ++, G ++, 189 bajtów
Nie ma potrzeby przeprowadzania testów
Wymaga instalacji
g++
z obsługą C ++ 14Teraz wyjaśnienia:
źródło
Pyth , 27 bajtów
Wypróbuj online!
W przeciwieństwie do poprzedniej (teraz usuniętej) odpowiedzi Pyth, ta przekazuje wszystkie przypadki testowe w pytaniu, chociaż jest ona o 3 bajty dłuższa.
źródło
C (gcc) / Bash / C ++, 118 bajtów
Wypróbuj online!
źródło
popen
isystem
. Myślę-x
, że G ++ ma flagę do odczytu ze standardowego wejścia. To może być krótsze niż fopen, ale nie wiem, jak wywoływać ze stdin w C.popen
polecenieprintf
->echo
wydaje się działać. Wkrótce będziesz programować w bash.Java,
158154 bajtówTo tylko czekanie na obrzucenie ogniem. Po prostu wypróbowuje wyrażenia regularne, aż coś zadziała i domyślnie zostanie hex.
-4 bajty dzięki @ValueInk
Wypróbuj online
Za pomocą ScriptEngine,
9287 bajtówJadący pociąg ewaluacyjny. Technicznie rzecz biorąc, przekazuje pochodnię JS, więc nie jest to moje główne przesłanie.
TIO
źródło
[bBxX]
i0[bB].+
dla niektórych szybkich optymalizacji wyrażeń regularnych.0x9999999999
)Long
zamiastInteger
do gry w golfa. Ponadto, jeśli masz rację, Python nie może konkurować, ponieważ ma skutecznie liczby całkowite o dowolnej dokładności. Równieżlong
w Javie jest liczbą całkowitą reprezentowaną przez 64 bity zamiast 32. Nie ma miejsc dziesiętnych.The correct output never will exceed 2*10^9
dość wyraźnie stwierdza, że oznacza to, że długiego nie można użyć samodzielnie, ponieważ mogę go podać,0x9999999999
a wygeneruje liczbę wyższa niż 2 * 10 ^ 9, podczas gdy C ++ spowodowałoby to problem przepełnienia pamięci, ponieważ używasz więcej niż 32 bitów pamięci, gdy przypisałeś tylko 32 bity pamięci do tej liczby