De acordo com http://en.cppreference.com/w/cpp/language/integer_literal , literais inteiros consistem em um literal decimal / hex / octal / binário e um sufixo inteiro opcional, que é obviamente completamente desnecessário, desperdiça bytes preciosos e é não usado neste desafio.
Um literal decimal é 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)
.
Um literal octal é the digit zero (0) followed by zero or more octal digits (0, 1, 2, 3, 4, 5, 6, 7)
.
Um literal hexadecimal é 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)
(observe a distinção entre maiúsculas e minúsculas de abcdefx
).
Um literal binário é the character sequence 0b or the character sequence 0B followed by one or more binary digits (0, 1)
.
Além disso, opcionalmente, pode haver alguns '
s como separador de dígitos. Eles não têm significado e podem ser ignorados.
Entrada
Uma sequência que representa um literal inteiro C ++ 14 ou uma matriz de seus códigos de caracteres.
Saída
O número representado pela sequência de entrada na base 10, com uma nova linha à direita opcional. A saída correta nunca excederá 2 * 10 ^ 9
Critérios de vitória
Os colaboradores do GCC precisam de mais de 500 linhas de código para fazer isso, portanto , nosso código deve ser o mais curto possível!
Casos de teste:
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
pode ser um bom caso de teste a ser adicionado (revelou um bug em uma das minhas revisões recentes).Respostas:
Japonês , 6 bytes
Experimente online!
fonte
'
da entrada e a avalio como Jscódigo de máquina x86 (32 bits),
59.57 bytesEsta função tem
esi
como um ponteiro para uma cadeia terminada por nulo e devolve o valor emedx
. (A listagem abaixo é uma entrada do GAS na sintaxe da AT&T.)E uma desmontagem com contagem de bytes - no formato Intel desta vez, caso você prefira esse.
E caso você queira experimentá-lo, eis o código do driver de teste C ++ que eu vinculei a ele (incluindo a especificação da convenção de chamada na sintaxe GCC asm):
-1 byte devido ao comentário de Peter Cordes
-1 byte da atualização para usar dois decrementos para alterar 10 para 8
fonte
rdx
e rbx? Then you can use 1-byte
cdq` para zero ardx
partir deeax
.JavaScript (Nó Babel) , 26 bytes
lol x2
Experimente online!
fonte
Number
porque lida com binários e hexadecimais, mas aparentemente não octalNumber("010") === 10
C ++ (gcc),
141138134120 bytesEssa é uma função que pega uma matriz de caracteres (especificada como um par de ponteiros para o início e o fim - usando o idioma dos pares de iteradores) e retorna o número. Observe que a função modifica a matriz de entrada.
(Isso depende do comportamento do gcc / libstdc ++ que
#include<cstdlib>
também coloca as funções no escopo global. Para código compatível estritamente padrão, substitua por#include<stdlib.h>
por um custo de mais um caractere.)Breve descrição: O código primeiro usa
std::remove
para filtrar'
caracteres (ASCII 39). Então,strtol
com uma base de 0, ele já manipulará os casos decimais, octais e hexadecimais, portanto, o único outro caso a ser verificado é um inicial0b
ou, em0B
caso afirmativo, defina a base parastrtol
2 e comece a analisar os 2 caracteres iniciais.Experimente online.
Economizou 3 bytes devido à sugestão do tetocat e mais alguns jogos de golfe que se seguiram.
Guardado 4 bytes devido a sugestões de grastropner.
-2 bytes de Lucas
-12 bytes por l4m2
fonte
#import
vez de#include
?0
para a base 2Python 2 , 32 bytes
Experimente online!
ri muito
(precisa do Python 2 porque o Python 3 mudou os literais octais para
0o(...)
).fonte
Perl 5 (-p), 14 bytes
TIO
fonte
R ,
797169 bytesExperimente online!
strtoi
faz tudo, exceto as conversões de base 2 e ignorando as'
, por isso há muitos bytes apenas para corrigir essas coisas.Agradecimentos a Aaron Hayman por -6 bytes e inspirando -4 mais bytes (e contando!)
Verifique todos os casos de teste (versão antiga)
fonte
sub("0b|B"
porsub("b|B"
, pois o "0" inicial não afetará o valor. Pode obter outro renomeandostrtoi
na.omit
antes. Super útil aqui, e joguei um pouco mais de golfe :-)strtoi
são binárias, você pode usar emsubstring
vez desub
salvar outro byte: Experimente online!s
uso,sub
com osub('..','',s)
qual é outro byte mais curto!05AB1E ,
1614 bytesEconomizou 2 bytes graças ao Grimy
Experimente online! ou como um conjunto de testes
Explicação
fonte
0010
).ï
!Excel, 115 bytes
Entrada de A1, saída para onde você coloca essa fórmula. Fórmula de matriz, use Ctrl+ Shift+ Enterpara inseri-la.
Adicionei alguns casos de teste que você pode ver na imagem - algumas tentativas anteriores trataram todos os casos de teste corretamente, mas as linhas 16 e / ou 17 estão erradas.
fonte
código de máquina x86-64, 44 bytes
(O mesmo código de máquina também funciona no modo de 32 bits.)
A resposta de @Daniel Schepler foi um ponto de partida para isso, mas isso tem pelo menos uma nova ideia algorítmica (não apenas um melhor aproveitamento da mesma idéia): Os códigos ASCII para
'B'
(1000010
) e'X'
(1011000
) fornecem 16 e 2 após mascarar0b0010010
.Então, após excluir decimal (dígito inicial diferente de zero) e octal (char após
'0'
é menor que'B'
), podemos apenas definir base =c & 0b0010010
e pular para o loop de dígitos.Chamadas com x86-64 System V como
unsigned __int128 parse_cxx14_int(int dummy, const char*rsi);
Extrai o valor de retorno EDX da metade alta dounsigned __int128
resultado comtmp>>64
.Os blocos alterados em relação à versão de Daniel são (principalmente) recuados menos do que outras instruções. Além disso, o loop principal tem sua ramificação condicional na parte inferior. Isso acabou sendo uma mudança neutra, porque nenhum dos caminhos poderia cair no topo, e o
dec ecx / loop .Lentry
ideia de entrar no circuito acabou não sendo uma vitória depois de lidar com o octal de maneira diferente. Mas ele tem menos instruções dentro do loop com o loop na forma idiomática do {} while estrutura, então eu o mantive.O equipamento de teste C ++ de Daniel funciona inalterado no modo de 64 bits com esse código, que usa a mesma convenção de chamada que sua resposta de 32 bits.
Desmontagem, incluindo os bytes do código da máquina que são a resposta real
Outras alterações da versão de Daniel incluem salvar o
sub $16, %al
de dentro do loop de dígitos, usando maissub
invés detest
como parte da detecção de separadores e dígitos vs. caracteres alfabéticos.Diferentemente de Daniel, todos os personagens abaixo
'0'
são tratados como separadores, não apenas'\''
. (Exceto' '
:and $~32, %al
/jnz
em ambos os nossos loops trata o espaço como um terminador, o que é possivelmente conveniente para testar com um número inteiro no início de uma linha.)Toda operação que modifica
%al
dentro do loop tem uma ramificação consumindo sinalizadores definidos pelo resultado e cada ramificação vai (ou cai) para um local diferente.fonte
eax
já que o AIUI no modo de 64 bits, com códigos de destino pequenos, redefinirá os bits mais altos para 0?setcc r/m8
parasetcc r/m32
, ainda precisamos de uma estúpida instrução de 2 instruçõesxor
-zero / set flags /setcc %al
sequence para criar um 0 ou 1 de 32/64 bits variável e precisa do registro zerado antes da configuração da sinalização. (Ou usemov $0, %eax
, ou usemovzx
no caminho crítico).Retina , 96 bytes
Experimente online! O link inclui o conjunto de testes. Explicação:
Exclua se
'
converta tudo para minúsculas.Separe os dígitos, pois qualquer dígito hexadecimal precisa ser convertido em decimal.
Identifique a base do número.
Converta os caracteres
a-g
em números10-16
.Realize a conversão base na lista de dígitos.
$.($`*$1*_*$2*
é curto para o$.($`*$1*_*$2*_)
qual multiplica$`
e$1
juntos e adiciona$2
. ($`
é a parte da cadeia antes;
da base, por exemplo).Exclua a base.
fonte
J , 48 bytes
Experimente online!
Avaliação após a substituição da corda.
fonte
0b
: tio.run/##FcwxCsIwFAbg/…Perl 6 , 29 bytes
Experimente online!
Perl 6 requer um explícito
0o
prefixo para octal e não suporta prefixos maiúsculos como0X
.Explicação
fonte
Oitava ,
292120 bytesExperimente online!
-8 bytes graças a @TomCarpenter
fonte
@(x)str2num(x(x~="'"))
@(x)str2num(x(x~=39))
f=("077")
retornaans = 77
quando deve ser 63. Ou, como no caso de teste no OP,f=("012345")
deve retornar 5349, mas em vez dissoans = 12345
Bash, 33 bytes
TIO
Zsh,
2927 bytes-2 bytes graças a @GammaFunction
TIO
fonte
setopt octalzeroes
que seria necessário para o Zsh.<<<$[...]
vez deecho $[...]
Go, 75
fonte
JavaScript (ES6), 112 bytes
fonte
Gelatina , 27 bytes
Experimente online!
Quase tudo isso é manipulação octal. Parece que poderia ser melhor jogado.
fonte
Ruby com
-n
, 17 bytesApenas pulando no
eval
trem, realmente.Experimente online!
fonte
Java (JDK) , 101 bytes
Experimente online!
Long.decode
lida com todos os tipos de literais, exceto os binários.Modelo emprestado da resposta de Benjamin
fonte
C (gcc) ,
120118 bytes-1 byte graças ao ceilingcat
Experimente online!
fonte
C (gcc),
1019783 bytesExperimente online
fonte
PHP - 43 bytes
Mesmo método que /codegolf//a/185644/45489
fonte
C ++, G ++, 189 bytes
Não há necessidade de testes
Requer instalação de
g++
com suporte ao C ++ 14Agora, explicações:
fonte
Pitão , 27 bytes
Experimente online!
Diferentemente da resposta Pyth anterior (agora excluída), esta é aprovada em todos os casos de teste da pergunta, apesar de ser 3 bytes mais longa.
fonte
C (gcc) / Bash / C ++, 118 bytes
Experimente online!
fonte
popen
esystem
. O G ++ tem uma bandeira, eu acho-x
, para ler do stdin. Isso pode ser mais curto do que abrir outras coisas, mas não sei como invocar com stdin em C.popen
comandoprintf
->echo
parece funcionar. Você estará programando no bash em breve.Java,
158154 bytesIsso apenas esperando para ser derrotado. Apenas tenta regexes até que algo funcione e o padrão seja hexadecimal.
-4 bytes graças a @ValueInk
Experimente online
Usando ScriptEngine,
9287 bytesTrem Eval chegando. Tecnicamente, isso está passando a tocha para JS, então não é minha principal submissão.
TIO
fonte
[bBxX]
e0[bB].+
para algumas otimizações rápidas de regex.0x9999999999
)Long
vez deInteger
para fins de golfe. Além disso, se você estiver correto, o Python não pode competir porque possui efetivamente números inteiros de precisão arbitrária. Além disso, along
em Java é um número inteiro representado com 64 bits em vez de 32. Não há casas decimais.The correct output never will exceed 2*10^9
afirma claramente que significa que long não pode ser usado por si só, porque eu posso dar0x9999999999
e isso produzirá um número maior que 2 * 10 ^ 9, enquanto o C ++ criaria um problema de estouro de memória porque você está usando mais de 32 bits na memória quando alocou apenas 32 bits de memória para esse número