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 + y
comox - -y
oux - (-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 = output
seu programa possa mudar2 * 2
para8/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 = output
onde 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
.
v
ser 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/y
porque 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.