Eu vi essa recente pergunta intrigante:
Adicione parênteses para tornar isso verdadeiro
E viu que uma resposta usava um script Python para tentar todas as possibilidades .
Seu desafio é, dada uma expressão (como uma string) e um número inteiro, criar um programa que possa dizer se você pode adicionar parênteses para tornar a expressão igual ao número inteiro.
Por exemplo, se a expressão é 1 + 2 * 3
e o número inteiro é 9
, você pode adicionar parênteses como (1 + 2) * 3
, o que é igual a 9, portanto a saída deve ser verdadeira. Mas se a expressão é 1 + 2 - 3 * 4 / 5
e o número inteiro é 9999999999999
, você não pode adicionar nenhuma quantidade de parênteses para torná-lo igual 9999999999999
, portanto a saída deve ser falsa.
Observe que a entrada inteira pode ser positiva ou negativa, mas a expressão conterá apenas números inteiros positivos. De fato, a expressão sempre corresponderá (\d+ [+*/-] )+ \d
(regex). Em outras palavras, há parênteses, há expoentes, apenas +
, -
, *
e /
. Ordem padrão do operador ( *
e /
, então +
e -
).
Mais casos de teste:
1 + 2 - 3 * 4 / 9 and -1 -> truthy, ((1 + 2) - (3 * 4)) / 9
10 - 9 * 8 - 7 * 6 - 5 * 4 - 3 * 2 - 2 * 1 and 1, falsey, see linked question
10 + 9 - 8 * 7 + 6 - 5 * 4 + 3 - 2 * 1 and 82 -> truthy, (10 + (9 - 8)) * 7 + (6 - 5) * 4 + 3 - 2 * 1
34 + 3 and 15 -> falsey
1 + 2 + 5 + 7 and 36 -> falsey
1 / 10 * 3 + 3 / 10 * 10 and 6 -> truthy, (1/10*3+3/10)*10
Alguma pergunta?
Você pode gerar a expressão entre parênteses, se possível, por exemplo, (10 + (9 - 8)) * 7 + (6 - 5) * 4 + 3 - 2 * 1
para o último caso de teste. Eu preferiria isso a apenas um valor verdadeiro, mas depende de você. O uso 2(5)
para multiplicação não é permitido, apenas *
.
3 / 2 - 1 - 1 and 2 -> 3 / (2 - 1) - 1
/
é a divisão de flutuação, certo?