Preludio:
Quería entrenar haciendo casos de prueba, así que los probaré en algo fácil.
Desafío:
Tome cualquier entrada (cadena) dada (dentro del rango ASCII visible) y deduzca si es un número y genere algo que pueda usarse para evaluar.
Reglas:
- Un número solo contendrá los caracteres
-0123456789,.
- Las respuestas solo son necesarias para reconocer números entre -1000000000 y 1000000000 (exclusivo), pero pueden reconocer números arbitrariamente grandes.
- Puede escribir un programa completo o una función.
- Si es un número, devuelva cualquier cosa que pueda usarse para discernirlo y documente el resultado en la descripción (ej.
My program outputs T if a number, F if not.
). - La entrada será cualquier cantidad de caracteres dentro del rango ASCII o vacía (si está vacía, devuelve lo que haya generado si no es un número).
- Los números pueden incluir un punto decimal (ej.
3.14
). Si lo hacen, deben tener al menos un dígito antes del punto decimal y al menos uno después. - Los números pueden tener ceros iniciales o finales (ej.
000001.00000
). - La parte entera de un número podría dividirse para facilitar su lectura en trozos de tres dígitos con comas (ej.
1,000.23456
). En este caso deberán ser divididos cada tres dígitos de derecha a izquierda (ej.1,234,567
,10,000.202
,123,234.00
,0,123.293
). - Los números negativos se indican con un interlineado
-
(ej.-1.23
). Un líder+
para indicar un número positivo no está permitido, y debe dar lugar a la salida Falsy. - Las excepciones NO se cuentan como salida válida y discernible (excepto cuando pueden pasar salidas a la secuencia de salida estándar (p. Ej.,
Exception on line N [...]
Pueden ingresarse como salida para un número / no número si la cadena se coloca en la secuencia de salida estándar).
Casos de prueba:
(asumiendo la My program outputs T if a number, F if not.
versión)
123 -> T [on integer]
-123 -> T [negative numbers need to be handled]
0 -> T [on zero]
123.456 -> T [on floating point]
123,456.789 -> T [on evenly divided by 3 digits with comas]
123456789 -> T [thousand separators are not required]
0000001.00000 -> T [on leading/trailing zeros]
00.00 -> T [on zero and leading/trailing zeros]
999999999.9999999999999999999999999999999999999999999999999999 -> T [on close to the maximum value]
-999999999.9999999999999999999999999999999999999999999999999999 -> T [on close to the minimum value]
-> F [on empty]
lolz -> F [on non-number value]
n4melyh4xor -> F [on non-number with digits]
1.2 -> F [on space-padded]
9.3 1.3 -> F [on anyhow separated multiple numbers]
1e5 -> F [no scientific notation]
50cl05e.buty3ts0f4r -> F [on input with letters obscuring the number]
1,2,3,4.5678 -> F [on badly readability-divided number]
1,234.5,678 -> F [on readability-divided floating point part]
.234 -> F [on no leading zero]
+1 -> F [no leading + sign]
1.234.3 -> F [only one decimal point]
12345,678 -> F [on separator stopping mid-way]
code-golf , menos personajes es el ganador.
code-golf
number
decision-problem
n4melyh4xor
fuente
fuente
-123
está bien, ¿qué pasa con+456
-> bueno o malo? ¿O+
queda fuera de la fiesta?Respuestas:
Retina ,
2829314034 bytesSalidas
1
si son verdaderas, de lo0
contrario. Por lo que entiendo, en este caso Retina emite el número de coincidencias que la expresión regular tiene en la entrada.Pruébalo en línea!
Banco de pruebas
Ediciones
Explicación
fuente
m
yg
) en Retina?`
frente a la expresión regular, y luego los modificadores van delante de eso, por ejemplom`^.$
.g
no existe en .NET, las coincidencias son globales de forma predeterminada.JavaScript
4649 bytesEste es un puerto directo de mi respuesta Retina. La única razón por la que usé JS es para que haya una manera fácil de probar la expresión regular utilizando el Snack Snippet a continuación
fuente
isNaN(+prompt())
16 caracteres. Así es la vida, supongoPerl 6 , 42 bytes
Intentalo
Expandido:
fuente
PHP, 62 bytes
La construcción no puede manejar comas y acepta notación científica; así que tuve que caminar por la expresión regular.
<?=is_numeric($argv[1]);
habría sido de 24 bytes.fuente
herramientas bash / Unix, 64 bytes
Guarde esto como un archivo y pase la cadena que se probará como el primer argumento para el comando.
La salida es 0 para un no número, 1 para un número.
Si está dispuesto a aceptar la entrada de stdin y puede garantizar que la entrada consta de una sola línea, puede eliminar el <<< "$ 1" al final, lo que resulta en 57 bytes .
En cuanto al código en sí, la opción -c para egrep cuenta el número de líneas coincidentes (que serán 0 o 1).
fuente
Pyth, 25 caracteres
Comprime la expresión regular de Kritixi Lithos .
Pruébalo en línea. Utiliza caracteres Unicode fuera del plano multilingüe básico, que TIO aparentemente no puede manejar. Sin embargo, esta pequeña aplicación informa el tamaño incorrecto de la cadena. Este contador de caracteres / bytes lo hace bien.
fuente
C89, 195 bytes
Sin golf:
fuente
Python 2, 79 bytes
Solución Regex
Pruébalo en línea
fuente
c #, 75 bytes
fuente