Множення між двома цілими числами може бути зведене в такий самий ряд додавання
3 * 5 = 3 + 3 + 3 + 3 + 3 = 5 + 5 + 5
Експоненцію (підняття a до сили b ) також можна звести на ряд множень:
5 ^ 3 = 5 * 5 * 5
Тому експоненцію можна звести на ряд доповнень, створивши вираз множення, потім на ряд доповнень. Наприклад, 5 ^ 3
(5 кубів) можна переписати як
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
Ваше завдання - задані вирази, додані разом, що складаються з експоненції, множення та додавання, звести їх до найкоротшої серії доповнень. Вираз "найкоротший" визначається як вираз з найменшою кількістю +
символів, все ще використовуючи лише одне з двох чисел у вихідному виразі. Наприклад, найкоротший вираз 10 * 2
є 10 + 10
.
Числа, що беруть участь у введенні, будуть цілими додатними числами, а вираз буде складатися лише з +
(додавання), *
(множення) та ^
(експоненціація), а також цілих чисел та дужок ( ()
) для позначення переваги.
Вихід повинен складатися лише з натуральних чисел та +
символів. Не слід виводити окремі кроки скорочень, а лише кінцевий результат. Вихід може не складатися з чисел, які не відображаються на вході. Однак ви можете використовувати будь-які 3 різних символи замість них +*^
, але будь ласка, скажіть, які вони символи
Пробіли, що розділяють входи та виходи, можуть або не можуть використовуватися у ваших програмах, тобто 3 * 5
можуть бути виведені як або, 5 + 5 + 5
або 5+5+5
.
Зауважте, що в більшості випадків додавання фактично не виконується. Єдиний випадок, коли додавання потрібно виконати, це коли у вас є щось подібне 5 ^ (1 + 2)
, і в цьому випадку додавання необхідно продовжувати -> 5 ^ 3 -> 5 * 5 * 5 -> ...
. Дивіться тестовий випадок №4.
У вашому коді не потрібно обробляти входи, які отримують неоднозначне вираження. Наприклад, (2 + 2) * (4 + 1)
. Через правила, викладені до цього часу, мета - не обчислити відповідь, мета - спрощення до доповнень. Отже результат може бути різним залежно від порядку, коли вирази розв’язуються чи змінюються (які доповнення спростити, які залишити?). Інший неприпустимий приклад: ((3 + 2) ^ 2) ^ 3 -> ((3 + 2) * (3 + 2)) ^ 3 -> ???
.
Це код-гольф, тому виграє найкоротший код
Тестові справи
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.
але початковий вираз може мати більше двох чисел. Я не розумію, чому 8 + 8
це недійсний вихід 2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1
. Це питання досі для мене досить незрозуміле.
**
замість^
?