Согласно http://en.cppreference.com/w/cpp/language/integer_literal , целочисленные литералы состоят из десятичного / шестнадцатеричного / восьмеричного / двоичного литерала и необязательного целочисленного суффикса, который, очевидно, совершенно не нужен, тратит драгоценные байты и является не используется в этом вызове.
Десятичный литерал есть 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)
.
Восьмеричное буквальное обозначение есть the digit zero (0) followed by zero or more octal digits (0, 1, 2, 3, 4, 5, 6, 7)
.
Шестнадцатеричный литерал 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)
(обратите внимание на регистр символов abcdefx
).
Бинарный литерал есть the character sequence 0b or the character sequence 0B followed by one or more binary digits (0, 1)
.
Кроме того, могут быть некоторые '
s в качестве разделителя цифр. Они не имеют смысла и могут быть проигнорированы.
вход
Строка, представляющая целочисленный литерал C ++ 14 или массив его кодов.
Выход
Число, представленное входной строкой в базе 10, с необязательным завершающим переводом строки. Правильный вывод никогда не будет превышать 2 * 10 ^ 9
Критерии победы
Для этого участникам GCC требуется более 500 строк кода, поэтому наш код должен быть как можно короче!
Тестовые случаи:
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
может быть хорошим тестовым примером для добавления (она обнаружила ошибку в одной из моих последних ревизий).Ответы:
Japt , 6 байт
Попробуйте онлайн!
источник
'
32-разрядный машинный код x86,
5957 байтЭта функция берет
esi
указатель на строку с нулевым символом в конце и возвращает значение вedx
. (Ниже приведен вход GAS в синтаксисе AT & T.)И разборка с количеством байтов - на этот раз в формате Intel, если вы предпочитаете этот.
И если вы хотите попробовать это, вот код тестового драйвера C ++, который я с ним связал (включая спецификацию соглашения о вызовах в синтаксисе asm GCC):
-1 байт из-за комментария Питера Кордеса
-1 байт от обновления, чтобы использовать два декремента, чтобы изменить 10 на 8
источник
rdx
и rbx? Then you can use 1-byte
cdq` на нольrdx
сeax
.JavaScript (Babel Node) , 26 байт
лол х2
Попробуйте онлайн!
источник
Number
потому что он обрабатывает двоичные и шестнадцатеричные, но, видимо, не восьмеричныеNumber("010") === 10
C ++ (gcc),
141138134120 байтЭто функция, которая принимает массив символов (заданный в виде пары указателей на начало и конец - с использованием пары итераторов идиомы) и возвращает число. Обратите внимание, что функция мутирует входной массив.
(Это зависит от поведения gcc / libstdc ++, которое
#include<cstdlib>
также помещает функции в глобальную область видимости. Для строго стандартного кода замените его#include<stdlib.h>
на стоимость еще одного символа.)Краткое описание: Код сначала используется
std::remove
для фильтрации'
символов (ASCII 39). Затемstrtol
с основанием 0 уже будут обрабатываться десятичные, восьмеричные и шестнадцатеричные регистры, поэтому единственный другой случай, который нужно проверить, это ведущий0b
или,0B
и если так, установите основание дляstrtol
2 и начните анализ после первых 2 символов.Попробуйте онлайн.
Сэкономлено 3 байта благодаря предложению потолка и последующему игре в гольф.
Сохранено 4 байта благодаря предложениям grastropner.
-2 байта от Лукаса
-12 байтов на l4m2
источник
#import
вместо#include
?0
основанием 2Python 2 , 32 байта
Попробуйте онлайн!
смешно
(нужен Python 2, потому что Python 3 изменил восьмеричные литералы на
0o(...)
).источник
Perl 5 (-p), 14 байтов
TIO
источник
R ,
797169 байтПопробуйте онлайн!
strtoi
делает все, кроме преобразований base 2 и игнорирования'
, так что для исправления этих вещей достаточно много байтов.Спасибо Аарону Хейману за -6 байтов и за вдохновляющие -4 байта (и считая!)
Проверьте все контрольные примеры (старая версия)
источник
sub("0b|B"
наsub("b|B"
, так как начальный «0» не повлияет на значение. Можно получить другое, переименовавstrtoi
na.omit
. Здесь очень удобно, и я немного поиграл в гольф :-)strtoi
является двоичным, вы можете использоватьsubstring
вместоsub
сохранения другой байт: попробуйте онлайн!s
использованияsub
вместоsub('..','',s)
которых еще на один байт короче!05AB1E ,
1614 байтовСохранено 2 байта благодаря Grimy
Попробуйте онлайн! или как тестовый набор
объяснение
источник
0010
).ï
!Excel, 115 байт
Ввод от А1, вывод туда, куда вы положили эту формулу. Формула массива, поэтому используйте Ctrl+ Shift+, Enterчтобы ввести его.
Я добавил пару тестовых случаев, которые вы можете видеть на картинке - некоторые ранние попытки корректно обрабатывали все данные тестовые примеры, но строки 16 и / или 17 были ошибочными.
источник
машинный код x86-64, 44 байта
(Тот же машинный код работает и в 32-битном режиме.)
Ответ @Daniel Schepler был отправной точкой для этого, но у него есть по крайней мере одна новая алгоритмическая идея (а не просто лучшая игра в ту же идею): ASCII-коды для
'B'
(1000010
) и'X'
(1011000
) дают 16 и 2 после маскирования с0b0010010
.Таким образом, после исключения десятичной (ненулевая начальная цифра) и восьмеричной (символ после
'0'
меньше'B'
), мы можем просто установить base =c & 0b0010010
и перейти в цикл цифр.Вызывается с x86-64 System V as
unsigned __int128 parse_cxx14_int(int dummy, const char*rsi);
Извлеките возвращаемое значение EDX из верхней половиныunsigned __int128
результата с помощьюtmp>>64
.Измененные блоки по сравнению с версией Дэниела (в основном) имеют отступ меньше, чем другие инструкции. Также основной цикл имеет свою условную ветвь внизу. Это оказалось нейтральным изменением, потому что ни один путь не мог попасть в его верхнюю часть, и
dec ecx / loop .Lentry
идея войти в цикл оказалась не победой после обработки восьмеричного числа по-другому. Но внутри цикла меньше инструкций с циклом в идиоматической форме do {} while struct, поэтому я сохранил его.Испытание Даниэля C ++ в этом коде работает без изменений в 64-битном режиме, который использует то же соглашение о вызовах, что и его 32-битный ответ.
Разборка, включая байты машинного кода, которые являются фактическим ответом
Другие изменения по сравнению с версией Дэниела включают в себя сохранение
sub $16, %al
изнутри цифрового цикла с использованием большегоsub
вместоtest
определения разделителей, а также цифр и буквенных символов.В отличие от Даниэля, каждый символ ниже
'0'
рассматривается как разделитель, а не просто'\''
. (За исключением' '
:and $~32, %al
/jnz
в обоих наших циклах пространство рассматривается как терминатор, что, возможно, удобно для тестирования с целым числом в начале строки.)Каждая операция, которая изменяется
%al
внутри цикла, имеет флаги потребления ветвей, установленные результатом, и каждая ветвь проходит (или проваливается) в другое место.источник
eax
учитывая, что AIUI в операционных кодах 64-битного режима с маленьким адресатом сбрасывает старшие биты в 0?setcc r/m8
наsetcc r/m32
, поэтому нам все еще нужна глупая 2-инструкцияxor
-zero / set flags /setcc %al
sequence для создания 32/64-битных 0 или 1 переменная, и ему нужен обнуленный регистр перед установкой флага. (Или используйтеmov $0, %eax
вместо этого, или используйтеmovzx
на критическом пути).Сетчатка , 96 байт
Попробуйте онлайн! Ссылка включает тестовый набор. Объяснение:
Удалить
'
s и преобразовать все в нижний регистр.Разделяйте цифры, так как любые шестнадцатеричные цифры должны быть преобразованы в десятичные.
Определите базу числа.
Преобразуйте символы
a-g
в числа10-16
.Выполните базовое преобразование по списку цифр.
$.($`*$1*_*$2*
это сокращение для$.($`*$1*_*$2*_)
которого умножается$`
и$1
вместе и добавляет$2
. ($`
является частью строки перед;
т. е. основанием.)Удалить базу.
источник
J , 48 байтов
Попробуйте онлайн!
Eval после подстановки строки.
источник
0b
: tio.run/##FcwxCsIwFAbg/…Perl 6 , 29 байт
Попробуйте онлайн!
Perl 6 требует явного
0o
префикса для восьмеричного кода и не поддерживает прописные префиксы, такие как0X
.объяснение
источник
Октава ,
292120 байтПопробуйте онлайн!
-8 байт благодаря @TomCarpenter
источник
@(x)str2num(x(x~="'"))
@(x)str2num(x(x~=39))
f=("077")
возвращает,ans = 77
когда он должен быть 63. Или, как в тестовом случае в OP,f=("012345")
должен возвращать 5349, но вместо этогоans = 12345
Баш, 33 байта
TIO
Зш,
2927 байт-2 байта благодаря функции @GammaFunction
TIO
источник
setopt octalzeroes
что это будет необходимо для Zsh.<<<$[...]
вместоecho $[...]
Go, 75
источник
JavaScript (ES6), 112 байт
источник
Желе , 27 байт
Попробуйте онлайн!
Почти все это восьмеричное обращение. Чувствуется, что это может быть лучше в гольф.
источник
Рубин с
-n
17 байтамиПросто прыгаю в
eval
поезде, правда.Попробуйте онлайн!
источник
Java (JDK) , 101 байт
Попробуйте онлайн!
Long.decode
имеет дело со всеми видами литералов, кроме двоичных.Шаблон заимствован из ответа Бенджамина
источник
C (gcc) ,
120118 байтов-1 байт благодаря возрастанию
Попробуйте онлайн!
источник
C (gcc)
1019783 байтаПопробуйте онлайн
источник
PHP - 43 байта
Тот же метод, что и /codegolf//a/185644/45489
источник
C ++, G ++, 189 байт
Нет необходимости в тестах
Требуется установка
g++
с поддержкой C ++ 14Теперь объяснения:
источник
Pyth , 27 байт
Попробуйте онлайн!
В отличие от предыдущего (теперь удаленного) ответа Pyth, он проходит все тестовые случаи в вопросе, хотя он на 3 байта длиннее.
источник
C (gcc) / Bash / C ++, 118 байт
Попробуйте онлайн!
источник
popen
иsystem
. Думаю-x
, у G ++ есть флаг для чтения со стандартного ввода. Это может быть короче, чем fopen, но я не знаю, как вызвать с stdin в C.popen
командуprintf
->echo
Кажется, работает. Ты скоро будешь программировать на bash.Java,
158154 байтаЭто просто ожидание, чтобы обойтись. Просто пытается регулярные выражения, пока что-то работает, и по умолчанию в hex.
-4 байта благодаря @ValueInk
Попробуйте онлайн
Используя ScriptEngine,
9287 байтEval поезд приближается. Технически это передача факела JS, так что это не моя основная подача.
TIO
источник
[bBxX]
и0[bB].+
для быстрой оптимизации регулярных выражений.0x9999999999
)Long
вместоInteger
целей игры в гольф. Кроме того, если вы правы, Python не может конкурировать, потому что он имеет целые числа произвольной точности. Кроме того,long
в Java это целое число, представленное 64 битами вместо 32. Десятичных разрядов нет.The correct output never will exceed 2*10^9
нем совершенно ясно говорится, что значение long не может использоваться само по себе, потому что я могу дать его,0x9999999999
и оно произведет число выше, чем 2 * 10 ^ 9, тогда как C ++ создаст проблему переполнения памяти, потому что вы используете более 32 бит в памяти, когда вы выделили только 32 бита памяти для этого числа