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 queab
no se permite la multiplicación por yuxtaposición ?2+(3+4)
que te cambien2+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 :(Respuestas:
C #,
523519504 bytes¡Comprueba los comentarios en código para ver cómo funciona!
Golfed
Sin golf
Notas al margen
PD: Si tiene una sugerencia o encontró un error, hágamelo saber en los comentarios e intentaré solucionarlo (luego agregaré una nota sobre la corrección del error con su nombre;))
fuente
C ++, 284 bytes
Golfed
Sin golf
fuente