De acuerdo con http://en.cppreference.com/w/cpp/language/integer_literal , los literales enteros consisten en un literal decimal / hexadecimal / octal / binario y un sufijo entero opcional, que obviamente es completamente innecesario, desperdicia bytes preciosos y es No se utiliza en este desafío.
Un literal decimal es 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)
.
Un literal octal es the digit zero (0) followed by zero or more octal digits (0, 1, 2, 3, 4, 5, 6, 7)
.
Un literal hexadecimal es 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)
(tenga en cuenta la mayúsculas y minúsculas de abcdefx
).
Un literal binario es the character sequence 0b or the character sequence 0B followed by one or more binary digits (0, 1)
.
Además, opcionalmente puede haber algunos '
s como separador de dígitos. No tienen significado y pueden ser ignorados.
Entrada
Una cadena que representa un literal entero C ++ 14 o una matriz de sus códigos de caracteres.
Salida
El número representado por la cadena de entrada en la base 10, con una nueva línea final opcional. La salida correcta nunca excederá 2 * 10 ^ 9
Criterios ganadores
Los contribuyentes de GCC necesitan más de 500 líneas de código para hacer esto, por lo tanto , nuestro código debe ser lo más corto posible.
Casos de prueba:
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
podría ser un buen caso de prueba para agregar (reveló un error en una de mis revisiones recientes).Respuestas:
Japt , 6 bytes
Pruébalo en línea!
fuente
'
de la entrada y luego lo evalúo como Jscódigo de máquina x86 (32 bits),
5957 bytesEsta función toma
esi
como puntero a una cadena terminada en nulo y devuelve el valor enedx
. (El listado a continuación es una entrada de GAS en la sintaxis de AT&T).Y un desmontaje con recuento de bytes, esta vez en formato Intel, en caso de que prefiera ese.
Y en caso de que quiera probarlo, aquí está el código del controlador de prueba de C ++ que vinculé con él (incluida la especificación de la convención de llamada en la sintaxis asm de GCC):
-1 byte debido al comentario de Peter Cordes
-1 byte desde la actualización para usar dos decrementos para cambiar de 10 a 8
fuente
rdx
y RBX? Then you can use 1-byte
cdq` a cerordx
a partireax
.JavaScript (nodo de Babel) , 26 bytes
lol x2
Pruébalo en línea!
fuente
Number
porque maneja binario y hexadecimal, pero aparentemente no octalNumber("010") === 10
C ++ (gcc),
141138134120 bytesEsta es una función que toma una matriz de caracteres (especificada como un par de punteros al inicio y al final, usando el par de expresiones idiomáticas) y devuelve el número. Tenga en cuenta que la función muta la matriz de entrada.
(Esto se basa en el comportamiento de gcc / libstdc ++ que
#include<cstdlib>
también coloca las funciones en el ámbito global. Para un código estrictamente compatible, reemplácelo#include<stdlib.h>
por un costo de un carácter más).Breve descripción: El código primero se usa
std::remove
para filtrar'
caracteres (ASCII 39). Luego,strtol
con una base de 0 ya manejará los casos decimales, octales y hexadecimales, por lo que el único otro caso para verificar es un inicio0b
o, de0B
ser así, establecer la base parastrtol
2 y comenzar a analizar después de los 2 caracteres iniciales.Pruébalo en línea.
Guardado 3 bytes debido a la sugerencia de ceilingcat y un poco más de golf que siguió.
Guardado 4 bytes debido a sugerencias de grastropner.
-2 bytes por Lucas
-12 bytes por l4m2
fuente
#import
lugar de#include
?0
para la base 2Python 2 , 32 bytes
Pruébalo en línea!
jajaja
(necesita Python 2 porque Python 3 cambió los literales octales a
0o(...)
).fuente
Perl 5 (-p), 14 bytes
TIO
fuente
R ,
797169 bytesPruébalo en línea!
strtoi
hace todo excepto las conversiones de base 2 e ignora las'
, por lo que hay bastantes bytes solo para arreglar esas cosas.Gracias a Aaron Hayman por -6 bytes, e inspirando -4 bytes más (¡y contando!)
Verificar todos los casos de prueba (versión anterior)
fuente
sub("0b|B"
porsub("b|B"
, ya que el "0" inicial no afectará el valor. Puede obtener otro renombrandostrtoi
na.omit
antes. Súper práctico aquí, y jugué un poco más al golf :-)strtoi
es un binario, puede usarlo ensubstring
lugar desub
guardar otro byte: Pruébelo en línea!s
uso en susub
lugar consub('..','',s)
cual es otro byte más corto!05AB1E ,
1614 bytesGuardado 2 bytes gracias a Grimy
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
0010
).ï
!Excel, 115 bytes
Entrada desde A1, salida a donde sea que coloque esta fórmula. Fórmula de matriz, así que usa Ctrl+ Shift+Enter para ingresarla.
Agregué un par de casos de prueba que puede ver en la imagen: algunos intentos iniciales manejaron todos los casos de prueba dados correctamente pero obtuvieron las filas 16 y / o 17 incorrectas.
fuente
Código de máquina x86-64, 44 bytes
(El mismo código de máquina también funciona en modo de 32 bits).
La respuesta de @Daniel Schepler fue un punto de partida para esto, pero tiene al menos una nueva idea algorítmica (no solo un mejor golf de la misma idea): los códigos ASCII para
'B'
(1000010
) y'X'
(1011000
) dan 16 y 2 después de enmascarar con0b0010010
.Entonces, después de excluir decimal (dígito inicial distinto de cero) y octal (char después
'0'
es menor que'B'
), podemos establecer base =c & 0b0010010
y saltar al ciclo de dígitos.Se puede llamar con x86-64 System V como
unsigned __int128 parse_cxx14_int(int dummy, const char*rsi);
Extrae el valor de retorno EDX de la mitad alta delunsigned __int128
resultado contmp>>64
.Los bloques modificados contra la versión de Daniel tienen (en su mayoría) sangría menos que otras instrucciones. Además, el bucle principal tiene su rama condicional en la parte inferior. Esto resultó ser un cambio neutral porque ninguno de los dos caminos podía caer en la parte superior y el
dec ecx / loop .Lentry
idea de ingresar al bucle resultó no ser una victoria después de manejar el octal de manera diferente. Pero tiene menos instrucciones dentro del bucle con el bucle en forma idiomática do {} mientras estructura, así que lo guardé.El arnés de prueba C ++ de Daniel funciona sin cambios en el modo de 64 bits con este código, que utiliza la misma convención de llamada que su respuesta de 32 bits.
Desmontaje, incluidos los bytes del código de máquina que son la respuesta real
Otros cambios de la versión de Daniel incluyen guardar el
sub $16, %al
desde el interior del bucle de dígitos, usando más ensub
lugar detest
como parte de la detección de separadores, y dígitos versus caracteres alfabéticos.A diferencia de Daniel, cada personaje a continuación
'0'
se trata como un separador, no solo'\''
. (Excepto' '
:and $~32, %al
/jnz
en nuestros dos bucles trata el espacio como un terminador, lo que posiblemente sea conveniente para probar con un número entero al comienzo de una línea).Cada operación que se modifica
%al
dentro del bucle tiene una rama que consume banderas establecidas por el resultado, y cada rama va (o cae) a una ubicación diferente.fuente
eax
dado que AIUI en códigos de operación de modo de 64 bits con destino pequeño restablecerá los bits más altos a 0?setcc r/m8
asetcc r/m32
, por lo que aún necesitamos una estúpida instrucción dexor
cero de 2 instrucciones /setcc %al
secuencia para crear un 0 o 1 de 32/64 bits variable, y necesita el registro a cero antes de la configuración de la bandera. (O usemov $0, %eax
en su lugar, o usemovzx
en la ruta crítica).Retina , 96 bytes
Pruébalo en línea! El enlace incluye un conjunto de pruebas. Explicación:
Eliminar
'
sy convertir todo a minúsculas.Separe los dígitos, ya que cualquier dígito hexadecimal debe convertirse a decimal.
Identifica la base del número.
Convierte los caracteres
a-g
en números10-16
.Realice la conversión de base en la lista de dígitos.
$.($`*$1*_*$2*
es la abreviatura de$.($`*$1*_*$2*_)
lo que multiplica$`
y$1
juntos y añade$2
. ($`
es la parte de la cadena antes de,;
es decir, la base).Eliminar la base.
fuente
J , 48 bytes
Pruébalo en línea!
Eval después de la sustitución de la cadena.
fuente
0b
: tio.run/##FcwxCsIwFAbg/…Perl 6 , 29 bytes
Pruébalo en línea!
Perl 6 requiere un
0o
prefijo explícito para octal y no admite prefijos en mayúscula como0X
.Explicación
fuente
Octava ,
292120 bytesPruébalo en línea!
-8 bytes gracias a @TomCarpenter
fuente
@(x)str2num(x(x~="'"))
@(x)str2num(x(x~=39))
f=("077")
regresaans = 77
cuando debería ser 63. O, como en el caso de prueba en OP,f=("012345")
debería devolver 5349 pero en su lugarans = 12345
Bash, 33 bytes
TIO
Zsh,
2927 bytes-2 bytes gracias a @GammaFunction
TIO
fuente
setopt octalzeroes
que sería necesario para Zsh.<<<$[...]
lugar deecho $[...]
Go, 75
fuente
JavaScript (ES6), 112 bytes
fuente
Jalea , 27 bytes
Pruébalo en línea!
Casi todo esto es manejo octal. Siente que podría ser mejor golfizado.
fuente
Rubí con
-n
17 bytesSolo saltando en el
eval
tren, de verdad.Pruébalo en línea!
fuente
Java (JDK) , 101 bytes
Pruébalo en línea!
Long.decode
trata con todo tipo de literales, excepto los binarios.Plantilla tomada de la respuesta de Benjamin
fuente
C (gcc) ,
120118 bytes-1 byte gracias a ceilingcat
Pruébalo en línea!
fuente
C (gcc),
1019783 bytesPruébalo en línea
fuente
PHP: 43 bytes
Mismo método que /codegolf//a/185644/45489
fuente
C ++, G ++, 189 bytes
No hay necesidad de pruebas
Requiere instalación
g++
con soporte C ++ 14Ahora, explicaciones:
fuente
Pyth , 27 bytes
Pruébalo en línea!
A diferencia de la respuesta Pyth anterior (ahora eliminada), esta pasa todos los casos de prueba en la pregunta, aunque es 3 bytes más larga.
fuente
C (gcc) / Bash / C ++, 118 bytes
Pruébalo en línea!
fuente
popen
ysystem
. G ++ tiene una bandera, creo-x
, para leer de stdin. Eso podría ser más corto que las cosas de fopen, pero no sé cómo invocar con stdin en C.popen
comandoprintf
->echo
parece funcionar. Vas a programar en bash pronto.Java,
158154bytesEsto solo esperando ser superado. Solo intenta expresiones regulares hasta que algo funciona y por defecto es hexadecimal.
-4 bytes gracias a @ValueInk
Pruébalo en línea
Usando ScriptEngine,
9287 bytesTren de evaluación llegando. Técnicamente, esto está pasando la antorcha a JS, por lo que no es mi presentación principal.
TIO
fuente
[bBxX]
y0[bB].+
para algunas optimizaciones rápidas de expresiones regulares.0x9999999999
)Long
lugar deInteger
para jugar al golf. Además, si tiene razón, Python no puede competir porque tiene enteros de precisión arbitraria. Además, unlong
en Java es un entero representado con 64 bits en lugar de 32. No hay lugares decimales.The correct output never will exceed 2*10^9
dice claramente que eso significa que no se puede usar solo porque puedo darlo0x9999999999
y producirá un número superior a 2 * 10 ^ 9, mientras que C ++ crearía un problema de desbordamiento de memoria porque está utilizando más de 32 bits en la memoria cuando ha asignado solo 32 bits de memoria a este número