El reto
Usted es propietario de un servicio increíble llamado Coyote Beta , que responde mágicamente las preguntas de matemáticas que sus usuarios le envían a través de Internet.
Pero resulta que el ancho de banda es costoso. Tiene dos opciones: crear un " Coyote Beta Pro" o encontrar alguna forma de resolverlo. Recientemente, alguien preguntó (x + 2)
. ¿No podría enviar el cliente x+2
y el usuario no vería ninguna diferencia?
La tarea
Su tarea es "minificar" las expresiones matemáticas. Dada una expresión de entrada, debe eliminar los espacios en blanco y los paréntesis hasta que proporcione una representación mínima de la misma entrada. Los paréntesis alrededor de las operaciones asociativas no necesitan ser preservados.
Los únicos operadores que se dan aquí son +
, -
, *
, /
, y ^
(exponenciación), la asociatividad y precedencia matemática estándar. El único espacio en blanco dado en la entrada serán caracteres de espacio real.
Muestra de entrada / salida
Input | Output
------------|--------------
(2+x) + 3 | 2+x+3
((4+5))*x | (4+5)*x
z^(x+42) | z^(x+42)
x - ((y)+2) | x-(y+2)
(z - y) - x | z-y-x
x^(y^2) | x^y^2
x^2 / z | x^2/z
- (x + 5)+3 | -(x+5)+3
Puntuación
La entrada / salida puede usar cualquier método preferido. El programa más pequeño en bytes gana.
Bits exactos
La exponenciación es correcta asociativa y también sigue la precedencia matemática estándar (siendo la más alta). Un literal numérico válido es /[0-9]+/
, y un literal variable válido es /[a-z]+/
. Un literal variable único representa un valor único incluso cuando la longitud de su carácter es mayor que 1.
Lo que se entiende por "los paréntesis alrededor de las operaciones asociativas no necesitan ser preservados" es que la salida debe consistir en una expresión que dé como resultado un árbol de análisis idéntico, con la excepción de que las operaciones asociativas pueden reorganizarse.
/[a-z]+/
, ¿eso significa que ab
no se permite la multiplicación por yuxtaposición ?
2+(3+4)
que te cambien 2+3+4
, verdad? Esto cambia el árbol de análisis.
x^(y/2)=x^y/2
; exponenciación tiene una precedencia orden superior, ergo, x^y/2=(x^y)/2
.
Prompt X:expr(X)
en TI-BASIC pero no puede simplificar :(