La multiplication entre 2 entiers peut être réduite en une série d'addition comme ça
3 * 5 = 3 + 3 + 3 + 3 + 3 = 5 + 5 + 5
L'exponentiation (élevant a à la puissance b ) peut également être réduite en une série de multiplications:
5 ^ 3 = 5 * 5 * 5
Par conséquent, l'exponentiation peut être réduite en une série d'additions, en créant une expression de multiplication, puis en une série d'additions. Par exemple, 5 ^ 3
(5 cubes) peut être réécrit en
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
Votre tâche consiste, compte tenu des expressions additionnées consistant en l'exponentiation, la multiplication et l'addition, à la réduire à la plus courte série d'additions. L'expression "la plus courte" est définie comme l'expression avec le moins de +
symboles, en utilisant toujours un seul des deux nombres dans l'expression d'origine. Par exemple, l'expression la plus courte de 10 * 2
est 10 + 10
.
Les nombres impliqués dans l'entrée seront tous des entiers positifs, et l'expression consistera uniquement en +
(addition), *
(multiplication) et ^
(exponentiation), ainsi que des entiers et des crochets ( ()
) pour indiquer la priorité.
La sortie doit être constituée +
uniquement d' entiers positifs et de symboles. Vous ne devez pas sortir les étapes individuelles des réductions, juste la sortie finale. La sortie peut ne pas être composée de chiffres qui n'apparaissent pas dans l'entrée. Cependant, vous pouvez utiliser 3 symboles distincts au lieu de +*^
, mais veuillez indiquer de quels symboles il s'agit.
Les espaces séparant les entrées et les sorties peuvent ou non être utilisés dans vos programmes, c'est-à-dire qu'ils 3 * 5
peuvent être sortis en tant que 5 + 5 + 5
ou 5+5+5
.
Notez que dans la plupart des cas, l'ajout n'est pas réellement effectué. Le seul cas où l'addition doit être effectuée est lorsque vous avez quelque chose comme 5 ^ (1 + 2)
, auquel cas, l'addition est nécessaire pour continuer -> 5 ^ 3 -> 5 * 5 * 5 -> ...
. Voir le cas de test n ° 4.
Votre code n'a pas besoin de gérer les entrées qui arrivent à une expression ambiguë. Par exemple (2 + 2) * (4 + 1)
,. En raison des règles énoncées jusqu'à présent, l'objectif n'est pas de calculer la réponse, l'objectif est de simplifier les ajouts. Ainsi, le résultat pourrait être différent selon l'ordre dans lequel les expressions sont résolues ou commutées (quels ajouts simplifier, lesquels laisser?). Un autre exemple invalide: ((3 + 2) ^ 2) ^ 3 -> ((3 + 2) * (3 + 2)) ^ 3 -> ???
.
C'est le code-golf donc le code le plus court gagne
Cas de test
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.
mais l'expression originale peut avoir plus de deux nombres. Je ne comprends pas pourquoi 8 + 8
n'est pas une sortie valide pour 2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1
. Cette question n'est toujours pas très claire pour moi.
**
place de^
?