Introdução
Os quatro operadores matemáticos básicos (+, -, *, /) podem ser reduzidos para apenas dois, devido ao fato de:
x + y = x - (-y)
x * y = x / (1/y), y != 0
x * 0 = 0/x
Desafio
O desafio é receber a entrada como uma "string" que contém:
- Números
- Variáveis de caractere único ("x", "y")
- Os quatro operadores matemáticos básicos (+, -, *, /)
- Parêntese
e produzir uma string manipulada para produzir o mesmo resultado matemático da entrada, mas contendo apenas os símbolos matemáticos '-' e '/'
Específicos
- A entrada pode estar em qualquer forma aceitável (arquivo, STDIN etc.) e pode ser representada como uma cadeia de caracteres ou matriz de caracteres (mas não uma matriz de matrizes)
- A saída pode estar em qualquer forma aceitável (arquivo, STDIN etc.) e pode ser representada como uma cadeia de caracteres ou matriz de caracteres (mas não uma matriz de matrizes)
- Você deve reconhecer e manter parênteses equilibrados
- As brechas padrão não são permitidas
- É sua escolha se você deseja representar
x + ycomox - -youx - (-y) - Você deve manter a ordem das operações
- Você nunca precisa lidar com entradas inválidas
- A entrada pode estar vazia ou um único número / variável; nesse caso, o programa deve emitir a entrada
- Nota: Você não precisa usar as substituições na introdução, desde que o
input = outputseu programa possa mudar2 * 2para8/2, se você desejar - Você pode assumir que "0" é a única maneira de um zero aparecer na equação (ou seja, você não precisa lidar com isso
1 * (4 - 4)) - Sugestão: para testar seu programa, vá para este site, digite
input = outputonde input é input e output é output, e se o resultado for "true", seu programa lidou com esse caso com êxito ( exemplo , exemplo )
Casos de teste
Abaixo estão alguns casos de teste, entrada como uma única sequência e saída como uma única sequência.
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))
Pontuação
É código-golfe , então a resposta mais curta em bytes vence. Os laços são resolvidos pela primeira postagem.
y=0, mas acho que o desafio implica isso implicitamente n/d => d != 0.
vser uma solução adequada em Pyth.
5 * (a - b)se a = b. E temos que detectar coisas assim 5 * (a - a)? Que tal 5 * (4 - 4)e 5 * (a / a - 1)ou 5 * (4 / 4 - 1)?
x / 1/y=x/yporque a divisão não é associativa. Eu sei o que você está pensando, mas mesmo o WolframAlpha não reconhece que deseja espaços para alterar a ordem das operações ... então você provavelmente deve repensar isso ou não citar isso como uma maneira válida de verificar as coisas.