Опис
У уявній мові програмування (IPL) використовується польська зворотна нотація. Він має такі команди:
- i - вхідний номер і натисніть його на стек
- o - неруйнівна вихідна верхівка стека (число залишається на стеку)
- d - відкинути верхню частину стека
- ціле число - натисніть це число на стек
- + - * - вискакуйте два числа із стеку, виконайте відповідну операцію та відсуньте результат. У IPL немає поділу.
IPL працює лише з цілими числами і використовується для простих обчислень. Програма IPL записується в один рядок і розділяється пробілами. Порожня рядок - дійсна програма IPL.
Програма IPL:
i i + o
Вводить два числа, додає їх разом і видає результат.
Числа введення та цілі числа, які можна натиснути на стек, знаходяться в діапазоні [-999, 999], однак вихід може бути будь-яким. Якщо ваша мова не підтримує велику кількість, все одно гаразд.
Формат вводу / виводу
Ви можете обрати будь-який формат вводу / виводу до тих пір, поки буде зрозуміло та прочитати / записати: рядок, список, лексеми тощо.
Завдання
Вам надають якусь програму IPL, її потрібно оптимізувати (зменшити довжину):
i 12 + 3 + o d 2 3 + d
Після оптимізації стане
i 15 + o
Вам не потрібно зберігати стан стека, але кількість входів і виходів та їх порядок повинні відповідати оригінальній та оптимізованій програмі.
Отже програма IPL:
-40 i * 2 * o i + 3 1 + o i 2 *
Після оптимізації стане
i -80 * o i 4 o i
або
-80 i * o i 4 o i
(зауважте, що вам потрібно зберегти всі входи, навіть якщо вони не мають значення).
Не повинно бути жорсткого кодування для тестових випадків, код повинен працювати на будь-якій довільній програмі IPL та виробляти найкоротші можливі програми IPL, що відповідають вимогам.
Оцінка балів
Кодовий рахунок-гольф за замовчуванням.
ОНОВЛЕННЯ: змінено підрахунок балів на чистий код гольфу, відповідно до пропозиції @Sanchises.
Тестові приклади:
Вхід:
(empty string)
Можливий вихід:
(empty string)
Вхід:
i 4 * 2 + 3 * 6 - o
Можливий вихід:
i 12 * o
Вхід:
1 1 + o
Можливий вихід:
2 o
Вхід:
i 2 + 3 + o d 2 3 + d
Можливий вихід:
i 5 + o
Вхід:
-40 i * 2 * o i + 3 1 + o i 2 *
Можливий вихід:
-80 i * o i 4 o i
Вхід:
i i 1 + i 1 + i 1 + i 1 + d d d d o
Можливий вихід:
i i i i i d d d d o
Вхід:
i i i 0 * * * o
Можливий вихід:
i i i 0 o
Вхід:
i i i 1 * * * o
Можливий вихід:
i i i * * o
Вхід:
i 222 + i 222 - + o
Можливий вихід:
i i + o
Вхід:
i 2 + 3 * 2 + 3 * 2 + 3 * i * d i 2 + 3 * i + d i o 2 + 2 - 0 * 1 o
Можливий вихід:
i i i i i o 1 o
Вхід:
i 1 + 2 * 1 + o
Можливий вихід:
i 2 * 3 + o
Вхід:
1 1 + o i 2 + 3 + o d 2 3 + d 4 i * 2 * o i + 3 1 + o i 2 * i i 1 + i 1 + i 1 + i 1 + d d d d o i i i 0 * * * o i i i 1 * * * o i 2 + i 2 - + o i 2 + 3 * 2 + 3 * 2 + 3 * i * d i 2 + 3 * i + d i o 2 + 2 - 0 * 1 o
Можливий вихід:
2 o i 5 + o 8 i * o i 4 o i i i i i i d d d d o i i i 0 o i i i * * * o i i + o i i i i i o 1 o
i i d o
щобi o i
(вхід в порядку , і вихід в порядку) , або якщо ви не спрощувати? (набір входів і виходів повинен бути в порядку)