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.
code-golf
string
arithmetic
balanced-string
Phoenix socrático
fonte
fonte
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.y=0
, mas acho que o desafio implica isso implicitamenten/d => d != 0
.v
ser uma solução adequada em Pyth.5 * (a - b)
se a = b. E temos que detectar coisas assim5 * (a - a)
? Que tal5 * (4 - 4)
e5 * (a / a - 1)
ou5 * (4 / 4 - 1)
?Respostas:
Python 3, 267 bytes
Obrigado a @ ConorO'Brien
Ideone it!
fonte
Dyalog APL , 42 bytes
Isso mantém a ordem das operações dos APLs. Note que
÷x
é1÷x
TryAPL online!
(
no resultado de ...~∘' '
remover espaços'(.*)×0'⎕R'0÷\1'
substitua qualquer coisa seguida por "× 0" por "0 ÷" seguida por ela)
Avalie...'\+' '×'⎕R'--' '÷÷'
substitua "+" por "-" e "×" por "÷÷"Verificar:
Atribuir aleatórias diferentes de zero para números
x
,y
,l
,g
, ea
.Execute as expressões originais.
Execute as expressões modificadas.
Compare os resultados.
fonte
SED
272 246 239213Tome entrada sem espaços (por exemplo
x+y*2
).Este é um dos poucos casos em que é realmente mais curto escapar
(
e)
capturar grupos em vez de usar-r
. Tenho certeza de que isso pode ser mais praticado, mas estou feliz por enquanto.Ungolfed, com comentários:
fonte