Introducción
Los cuatro operadores matemáticos básicos (+, -, *, /) se pueden reducir a solo dos, debido a que:
x + y = x - (-y)
x * y = x / (1/y), y != 0
x * 0 = 0/x
Desafío
El desafío es tomar la entrada como una "cadena" que contiene:
- Números
- Variables de un solo carácter ("x", "y")
- Los cuatro operadores matemáticos básicos (+, -, *, /)
- Paréntesis
y genera una cadena manipulada para que produzca el mismo resultado matemático que la entrada, pero que contenga solo los símbolos matemáticos '-' y '/'
Detalles específicos
- La entrada puede estar en cualquier forma aceptable (archivo, STDIN, etc.) y puede representarse como una cadena o matriz de caracteres (pero no como una matriz de matrices)
- La salida puede tener cualquier forma aceptable (archivo, STDIN, etc.) y puede representarse como una cadena o matriz de caracteres (pero no como una matriz de matrices)
- Debes reconocer y mantener un paréntesis equilibrado
- Las lagunas estándar no están permitidas
- Es su elección si quiere representar
x + y
comox - -y
ox - (-y)
- Debe mantener el orden de las operaciones.
- Nunca tiene que manejar entradas no válidas
- La entrada puede estar vacía o un solo número / variable, en ese caso el programa debería generar la entrada
- Nota: Usted no tiene que utilizar las sustituciones en la introducción, siempre y cuando
input = output
, el programa podría cambiar2 * 2
a8/2
, si desea - Puede suponer que "0" es la única forma en que aparecerá un cero en la ecuación (es decir, no tiene que manejarlo
1 * (4 - 4)
) - Sugerencia: para probar su programa, vaya a este sitio web escriba
input = output
, donde input es la entrada y output es la salida, y si el resultado es "verdadero", su programa manejó ese caso con éxito ( ejemplo , ejemplo )
Casos de prueba
A continuación se presentan algunos casos de prueba, ingresados como una sola cadena y producidos como una sola cadena.
x + y
x - (-y)
x * y
x / (1/y)
x / y
x / y
x - y
x - y
1
1
5
5
-6
-6
+x
x
1 + (x * 4) - (512 * 3)
1 - (-(x / (1/4))) - (512 / (1/3))
1 - 3 / 4 + l / g
1 - 3/4 - (-(l / g))
5 * 0 / 2
0/5 / 2
(a + g) * 0
0/(a - (-g))
Puntuación
Es código de golf , por lo que la respuesta más corta en bytes gana. Los empates se resuelven por primera publicación.
y=0
, pero supongo que el desafío lo asume implícitamente n/d => d != 0
.
v
ser una solución adecuada en Pyth.
5 * (a - b)
si a = b. ¿Y tenemos que detectar cosas como 5 * (a - a)
? ¿Qué tal 5 * (4 - 4)
y 5 * (a / a - 1)
o 5 * (4 / 4 - 1)
?
x / 1/y
=x/y
porque la división no es asociativa. Sé lo que estás pensando, pero incluso WolframAlpha no reconoce que quieres espacios para cambiar el orden de las operaciones ... así que probablemente deberías repensar esto o no mencionarlo como una forma válida de verificar las cosas.