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.
code-golf
string
arithmetic
balanced-string
Fénix Socrático
fuente
fuente
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.y=0
, pero supongo que el desafío lo asume implícitamenten/d => d != 0
.v
ser una solución adecuada en Pyth.5 * (a - b)
si a = b. ¿Y tenemos que detectar cosas como5 * (a - a)
? ¿Qué tal5 * (4 - 4)
y5 * (a / a - 1)
o5 * (4 / 4 - 1)
?Respuestas:
Python 3, 267 bytes
Gracias a @ ConorO'Brien
Ideone it!
fuente
Dyalog APL , 42 bytes
Esto mantiene el orden de las operaciones de APL. Tenga en cuenta que
÷x
es1÷x
TryAPL en línea!
(
sobre el resultado de ...~∘' '
eliminar espacios'(.*)×0'⎕R'0÷\1'
reemplace cualquier cosa seguida de "× 0" con "0 ÷" seguido de ella)
evaluar...'\+' '×'⎕R'--' '÷÷'
reemplace "+" con "-" y "×" con "÷ útiles"Para verificar:
Asignar al azar no cero números a
x
,y
,l
,g
, ya
.Ejecuta las expresiones originales.
Ejecute las expresiones modificadas.
Compara los resultados.
fuente
SED
272 246 239213Tomar entrada sin espacios (p
x+y*2
. Ej .).Este es uno de los pocos casos en los que es más corto escapar
(
y)
capturar grupos en lugar de usarlos-r
. Estoy seguro de que esto se puede jugar más, pero estoy feliz por ahora.Sin golf, con comentarios:
fuente