A multiplicação entre 2 números inteiros pode ser reduzida em uma série de adição como essa
3 * 5 = 3 + 3 + 3 + 3 + 3 = 5 + 5 + 5
Exponenciação (aumentando um para o poder b ) também pode ser reduzida para uma série de multiplicações:
5 ^ 3 = 5 * 5 * 5
Portanto, a exponenciação pode ser reduzida em uma série de adições, criando uma expressão de multiplicação e depois em uma série de adições. Por exemplo, 5 ^ 3
(5 em cubos) pode ser reescrito como
5 ^ 3 = 5 * 5 * 5
= (5 + 5 + 5 + 5 + 5) * 5
= (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5)
= 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5
Sua tarefa é, dadas expressões somadas que consistem em exponenciação, multiplicação e adição, reduza-a à menor série de adições. A expressão "menor" é definida como a expressão com o menor número de +
símbolos, ainda usando apenas um dos dois números na expressão original. Por exemplo, a expressão mais curta de 10 * 2
é 10 + 10
.
Os números envolvidos na entrada serão todos números inteiros positivos, e a expressão consistirá em apenas +
(adição), *
(multiplicação) e ^
(exponenciação), juntamente com números inteiros e colchetes ( ()
) para indicar precedência.
A saída deve consistir apenas de números inteiros positivos e +
símbolos. Você não deve emitir as etapas individuais das reduções, apenas a saída final. A saída pode não consistir em números que não apareçam na entrada. No entanto, você pode usar quaisquer 3 símbolos distintos em vez de +*^
, mas diga quais símbolos eles são
Os espaços que separam entradas e saídas podem ou não ser usados em seus programas, ou seja, 3 * 5
podem ser gerados como 5 + 5 + 5
ou 5+5+5
.
Observe que, na maioria dos casos, a adição não é realmente executada. O único caso em que a adição deve ser realizada é quando você tem algo como 5 ^ (1 + 2)
, nesse caso, a adição é necessária para continuar -> 5 ^ 3 -> 5 * 5 * 5 -> ...
. Veja o caso de teste nº 4.
Seu código não precisa manipular entradas que cheguem a uma expressão ambígua. Por exemplo (2 + 2) * (4 + 1)
,. Devido às regras estabelecidas até agora, o objetivo não é calcular a resposta, o objetivo é simplificar as adições. Portanto, o resultado pode ser diferente dependendo da ordem em que as expressões são resolvidas ou comutadas (quais adições simplificar, quais deixar?). Outro exemplo inválido: ((3 + 2) ^ 2) ^ 3 -> ((3 + 2) * (3 + 2)) ^ 3 -> ???
.
Isso é código-golfe, então o código mais curto ganha
Casos de teste
Input => output
5 ^ 3 + 4 * 1 ^ 5 => 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 4
2 ^ 1 * 2 + 3 + 9 => 2 + 2 + 3 + 9
2 ^ 1 * (2 + 3) + 9 => 2 + 3 + 2 + 3 + 9
2 ^ (1 * (2 + 3)) + 9 => 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 9
10 + 3 * 2 + 33 ^ 2 => 10 + 3 + 3 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33
100 * 3 => 100 + 100 + 100
2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1 => 2 + 2 + 2 + 2 + 8
(1 + 2 + 5 * 8 + 2 ^ 4) * 2 => 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2
using only one of the two numbers in the original expression.
mas a expressão original pode ter mais de dois números. Eu não entendo porque 8 + 8
não é uma saída válida para 2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1
. Essa pergunta ainda não está clara para mim.
**
vez de^
?