Convierta una cadena que contenga dígitos como palabras en un número entero, ignorando los ceros iniciales.
Ejemplos
"four two"
->42
."zero zero zero one"
->1
.
Supuestos
Las presentaciones pueden suponer que:
- La cadena de entrada se compone de palabras de dígitos separados por espacios.
- Todas las palabras son válidas (en el rango "cero" .. "nueve") y en minúsculas. El comportamiento de la entrada vacía no está definido.
- La cadena de entrada siempre representa un número sin signo dentro del rango de
int
y nunca es una cadena vacía.
Puntuación
Las respuestas se puntuarán en bytes, siendo menos bytes mejores.
code-golf
string
number
conversion
Bengala
fuente
fuente
range "zero".."nine"
no está completamente especificado.Interpreter@"SemanticNumber"
hace exactamente esto en Mathematica, excepto que falla en cadenas que comienzan conzero zero
.Respuestas:
PHP , 74 bytes
Pruébalo en línea!
Intenté obtener una solución que no copie las respuestas existentes. Obtengo un polinomio de suma de verificación de redundancia cíclica de 32 bits de longitud ( crc32 ) para cada palabra y luego hago un mod 20 y un mod 11 para mezclar valores únicos de 0 a 10 (faltan 6) para cada dígito. Luego, usando ese valor único, encuentro el dígito real.
Otra alternativa de 74 bytes CRC32 usando
%493%10
: ¡ Pruébelo en línea!Otra alternativa de 74 bytes CRC32 usando
%2326%11
: ¡ Pruébelo en línea!PHP , 74 bytes
Pruébalo en línea!
Otra alternativa con la misma longitud, toma el carácter 22 en la
md5
palabra (único carácter que le da un valor único para cada palabra) y luego usa ese carácter para mapear a un dígito.fuente
Python 2 ,
7170 bytes-1 gracias a ovs (uso
find
en lugar deindex
)Pruébalo en línea!
fuente
JavaScript (ES6),
70 67 6662 bytesGuardado 3 bytes gracias a @ovs
Pruébalo en línea!
fuente
'2839016547'[parseInt(s,36)%204%13]
es 3 bytes más corto.Jalea ,
1917 bytesUn enlace monádico que acepta una lista de caracteres que produce un número entero.
Pruébalo en línea!
Más o menos un puerto de mi respuesta Python 2.
Anterior
Pruébalo en línea!
Hay
muy posiblementeun camino más corto, pero esta es una manera de que primero vino a la mente.fuente
Python 3 ,
107,91,77, 90 bytes-16 bytes por Sriotchilism O'Zaic
+13 bytes para eliminar los ceros a la izquierda
Pruébalo en línea!
fuente
lstrip
método quita todos los caracteres de la cadena que se da como argumento, por lo que "ocho dos" se convierte en "ight two", ya que "e" se elimina. Además, "cero cero cero" debería imprimir "0", no dar un error.Perl 6 ,
3532 bytesPruébalo en línea!
Explicación
fuente
C (gcc) , 89 bytes
Pruébalo en línea!
Gracias a los trucos más inteligentes de @Ceilingcat:
fuente
05AB1E ,
1816 bytesPruébalo en línea.
Explicación:
Ver este consejo 05AB1E mío (sección Cómo comprimir cadenas que no forman parte del diccionario? ) Para entender por qué
.•ƒ/ÿßÇf•
es"rothuvsein"
.fuente
05AB1E ,
1716 bytesPruébalo en línea!
Empate perfecto con la otra respuesta 05AB1E , pero con un enfoque completamente diferente.
fuente
Retina 0.8.2 ,
4645 bytesPruébalo en línea! El enlace incluye casos de prueba. Explicación:
Pon cada palabra en su propia línea y triplicala.
Translitera el séptimo carácter de cada línea usando la cadena de @ UnrelatedString.
Eliminar todos los caracteres que no sean dígitos restantes.
Elimine los ceros a la izquierda (pero deje al menos un dígito).
Solución anterior más tradicional de 46 bytes:
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Las palabras
zero
,two
,four
,six
yeight
contienen únicamente las letraszwuxg
. Translítelos a los dígitos pares.Para los dígitos impares, solo combine las dos primeras letras de cada palabra individualmente.
Eliminar todos los caracteres que no sean dígitos restantes.
Elimine los ceros a la izquierda (pero deje al menos un dígito).
fuente
Jalea ,
201817 bytesPruébalo en línea!
-2 bytes desde la ejecución de "rothuvsein" a través del compresor de cadenas de user202729 .
-1 byte por robar la cadena de enklact libre de cero de Jonathan Allan y ponerla en un programa marginalmente diferente estructurado.
fuente
C ++ (gcc) ,
478218142 bytes- (mucho) gracias a Jo King
Pruébalo en línea!
fuente
Japt , 13 bytes
Intentalo
Parece que todos los demás me convencieron con la misma idea: podría haberme ahorrado la molestia de escribir un guión para forzar a la fuerza bruta a la secuencia óptima para la compresión, solo para descubrir que, hasta el índice
1,000,000
(era temprano, no había tenido mi cafeína todavía!), "rothuvsein" es la única secuencia posible!La cadena comprimida contiene los caracteres en los puntos de código
206
,168
,117
,118
,160
y136
.fuente
Ruby ,
63 bytes,52 bytes, 50 bytes-2 gracias al valor de la punta de tinta
fuente
$*
es un alias paraARGV
, así que siéntase libre de usarlo para guardar bytes adicionales.T-SQL, 110 bytes
El salto de línea es solo para legibilidad.
Explicación:
STRING_SPLIT
toma la cadena de entrada y la separa en los espaciosCHARINDEX
toma los primeros 2 caracteres y devuelve la posición (basada en 1) en la cadena'_ontwthfofisiseeini'
.'ze'
para cero no está en la cadena y devuelve 0 para "no encontrado". El guión bajo asegura que solo obtengamos múltiplos de dos.STRING_AGG
vuelve a juntar los dígitos sin separador0+
fuerza una conversión implícita a INT y elimina los ceros iniciales.1*
También funcionaría.fuente
código de máquina x86, 46 bytes
Hexdump:
Es una
fastcall
función: recibe un puntero a la cadena enecx
y devuelve el resultadoeax
.La función hash se multiplica por un número mágico.
1856645926
, hace unXOR
byte de entrada y se desplaza a la derecha por 2 bits.Guardar y restaurar registros de noclobber (
edi
yebx
) tomó 4 bytes, pero no encontré una forma más eficiente de implementar esto. ¡Almacenar la constante 10 enebx
fue particularmente molesto!Desmontaje con los bytes de código correspondientes:
Código C equivalente:
fuente
Limpio , 88 bytes
Pruébalo en línea!
Basada en la respuesta de Jonathan Allan .
Utiliza una comprensión para indexar en lugar de
indexOf
/elemIndex
.fuente
J , 38 bytes
Pruébalo en línea!
fuente
Carbón , 19 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Puerto de la respuesta 05AB1E de @ KevinCruijssen. Explicación:
fuente
PowerShell , 48 bytes
Pruébalo en línea!
Utiliza el mismo
rothuvsein
truco que otros, gracias a Jonathan Allan. Espera argumentos de entrada mediante splatting, que en TIO se manifiesta como argumentos de línea de comandos separados.fuente
Kotlin, 83 bytes
+1 byte si quieres soportar largos con
toLong()
El mismo truco de rothuvsein que los demás, ahorrando algunos bytes preciosos gracias a Kotlin's nice
toInt()
andfold()
. Sin embargo, no puedo evitar la sensación de que se pueden eliminar algunos bytes más ...fuente
sed -re , 78 bytes
fuente
Lote de Windows, 169 bytes
fuente
Perl 6 , 45 bytes
Pruébalo en línea!
fuente
VBA, 160 bytes
Coincide con los dos primeros caracteres de una cadena, cero excluido.
fuente
BaCon ,
8372 bytesSuponiendo que la cadena se proporciona en w $, este código busca el índice en "zeontwthfofisiseeini" utilizando una expresión regular basada en los primeros 2 caracteres únicos de cada palabra. El índice se divide entre 2 para obtener el resultado correcto.
fuente