A veces es útil ejecutar un problema matemático con múltiples entradas. El objetivo de este desafío es hacer un programa que facilite esta tarea.
Expresiones generadoras de números
Debe admitir 3 tipos de expresión:
- Generador de números únicos: muy simple, solo un número literal
- Generador de números múltiples: un poco más complicado. Estas están rodeadas de corchetes (
[]
). Los números están,
separados por comas ( ) en la expresión. Ejemplo[-1,2,3.26]
. - Generador de rango: este está rodeado de llaves (
{}
). Tendrá 3 números separados por una coma. El formato de esta expresión es{start,stop,step}
.start
ystop
son inclusivos
Reglas para la evaluación
- Debe apoyar el orden de las operaciones. ( https://en.wikipedia.org/wiki/Order_of_operations#Definition )
- No necesita apoyar paréntesis.
- Cualquier número de espacios puede ocurrir en la expresión.
- Debe admitir números de coma flotante (cualquiera que sea la precisión de su idioma está bien)
- División por
0
resultados enNaN
(no un número).
Su programa debe admitir multiplicación ( *
), división ( /
), suma ( +
) y resta ( -
).
Salida
Cada línea de salida es una de las combinaciones de los generadores. El formato es la expresión (con los números reales sustituidos en él) seguido de un signo igual ( =
) y el resultado de la evaluación. Todas las combinaciones de los generadores deben estar representadas en la salida.
Ejemplos
( >>>
denota entrada)
>>>3 * [3,2]
3 * 3 = 9
3 * 2 = 6
>>>{1,2,3}
1 = 1 <-- this is because 1 + 3 > the end
>>>{0,2,1} + {0,1,1}
0 + 0 = 0
1 + 0 = 1
2 + 0 = 2
0 + 1 = 1
1 + 1 = 2
2 + 1 = 3
>>>6/[2,3]
6/2 = 3
6/3 = 2
>>>{1.5,2.5,0.5}
1.5 = 1.5
2 = 2
2.5 = 2.5
>>>3-{6,5,-1}
3-6 = -3
3-5 = -2
>>>5/{-1,1,1}
5/-1 = -5
5/0 = NaN
5/1 = 5
>>>4.4 / [1,2.2] + {0,2,1}
4.4 / 1 + 0 = 4.4
4.4 / 1 + 1 = 5.4
4.4 / 1 + 2 = 6.4
4.4 / 2.2 + 0 = 2
4.4 / 2.2 + 1 = 3
4.4 / 2.2 + 2 = 4
>>> [1,2] / 0 + 5
1 / 0 + 5 = NaN
2 / 0 + 5 = NaN
El programa debe ser breve para que pueda memorizarlo y usarlo en cualquier lugar.
Gracias a @PeterTaylor y @geokavel por ayudarme con esta publicación en el sandbox.
x/0
resulta en una evaluación instantánea de NaN, o tengo que tratar el NaN como un valor?Respuestas:
JavaScript (ES6),
213211 bytesExplicación
Una función recursiva que ejecuta la expresión si no contiene generadores de varios números o rangos, o si contiene uno de estos generadores, se llama a sí mismo con el generador reemplazado por cada número producido por él.
Dividir por
0
en JavaScript produceInfinity
, porInfinity
lo que simplemente se puede reemplazar conNaN
.Con este método, los generadores múltiples se analizan de atrás hacia adelante en lugar de de adelante hacia atrás como en los casos de prueba. Esto solo significa que el orden de las expresiones de salida es diferente a veces.
Prueba
La prueba no utiliza asignaciones de desestructuración para la compatibilidad del navegador.
fuente
Haskell,
474362 bytesLa función f toma una cadena como entrada e imprime los resultados.
pruebas:
salida:
fuente
Python 3, 387 bytes
Puedes probarlo con el siguiente código:
Aquí está el código sin golf:
Funciona al encontrar el primer conjunto de corchetes de cualquier tipo y luego recorrer todos los valores dentro de él, reemplazando los corchetes y su contenido con el valor y ejecutando el método de forma recursiva. Se usa
eval
una vez que no hay corchetes en la línea. RegresaNaN
si hay una excepción en ejecucióneval
.fuente
e[:]=s[:]
? ¿Noe[:]=s
haría lo mismo?Java, 874 bytes
Prueba detallada aquí
fuente
Dyalog APL , 164 bytesEsta respuesta no sigue los requisitos actualizados y, por lo tanto, no es competitiva:
Utiliza expresiones regulares para cambiar la expresión dada en el APL correspondiente (y todos los operadores se modifican para implementar
NaN
) y para extraer los operadores. Sustituye todos los operadores con cateación y ejecuta la expresión para obtener los números de entrada finales. Luego lo entrelaza todo para obtener el resultado final.Conserva el orden de evaluación de APL (estricto de derecha a izquierda).
Maneja los paréntesis correctamente.
Casos de prueba (con paréntesis agregados para forzar el orden de ejecución matemático):
fuente