У позначенні префікса оператор виходить перед аргументами, тож ви можете уявити собі, що оператор викликає next()
рекурсивно викликані. У позначенні infix оператор переходить між аргументами, тому ви можете уявити його просто як дерево розбору. У позначеннях постфіксу оператор приходить після аргументів, тож ви можете просто уявити його як на основі стека.
У будь-якій нотації, оператор може перейти будь-де * . Якщо оператор з'являється і аргументів недостатньо, то оператор чекає, поки буде достатньо аргументів. Для цього завдання ви повинні реалізувати дуже базовий оцінювач будь-якої виправлення. (Зауважте, що будь-яке виправлення - це рекреаційна мова, якою я відмовився, з якою можна пограти тут або перевірити тут )
Вам потрібно буде підтримати наступні команди:
(Стаття 1)
- дублікат
- негативний
(Арти 2)
- доповнення
- множення
- рівність: повернення
0
або1
.
Ви можете використати для цих команд будь-які п’ять символів без пробілу. Для демонстраційних цілей я буду використовувати "
як дублікат, ×
як множення і +
як додавання.
Для літералів вам потрібно підтримувати лише негативні цілі числа, але ваш перекладач повинен мати можливість містити всі цілі числа (в межах розумного цілого діапазону).
Давайте подивимося на приклад: 10+5
. Сховище має вести себе як стек, а не чергу. Отже, спочатку стек починається з []
, і список операторів у черзі починається з []
. Потім 10
оцінюється літерал , який складає стек [10]
. Далі +
оцінюється оператор , для чого потрібні два аргументи. Однак у стеку є лише один аргумент, тому список операторів у черзі стає ['+']
. Потім 5
оцінюється літерал , який складає стек [10, 5]
. У цей момент оператор '+'
може бути оцінений таким чином, склавши стек [15]
і чергу []
.
Кінцевий результат повинен бути [15]
для + 10 5
, 10 + 5
і 10 5 +
.
Давайте подивимося на приклад складніше: 10+"
. Стек і черга починаються як []
і []
. 10
оцінюється спочатку, що робить стек [10]
. Далі, +
оцінюється, що не змінює стек (оскільки не вистачає аргументів) і робить чергу ['+']
. Потім, "
оцінюється. Це може запуститись одразу, так це, склавши стек [10, 10]
. +
тепер можна оцінити, так що стек стає [20]
і чергою []
. Кінцевий результат - [20]
.
А як щодо порядку операцій?
Давайте подивимось ×+"10 10
. Стек і черга починаються як []
:
×
: Стек не змінюється, і черга стає['×']
.+
: Стек не змінюється, і черга стає['×', '+']
."
: Стек не змінюється, і черга стає['×', '+', '"']
.10
: Стек стає[10]
. Незважаючи на те, що×
повинен бути першим оператором, який оцінюється, оскільки він з’являється першим, він"
може запуститись негайно, і жоден з операторів до цього не зможе, тому він оцінюється. Стек стає[10, 10]
і черга['×', '+']
.×
тепер можна оцінити, що робить стек[100]
і чергу['+']
.10
: Стек стає[100, 10]
, що дозволяє+
оцінювати. Стек стає[110]
і черга[]
.
Кінцевий результат - [110]
.
Команди, які використовуються в цих демонстраціях, відповідають командам будь-якої мови виправлення; проте останній приклад не працюватиме через помилку в моєму перекладачі. (Відмова: Ваші дані не використовуватимуться в інтерпретаторі anyfix)
Виклик
Виберіть набір з 5 нецифрових символів без пробілів та створіть інтерпретатор anyfix відповідно до наведених вище специфікацій. Ваша програма може вивести єдиний масив або значення, що міститься в ньому; гарантується, що стек значень буде містити лише одне значення в кінці виконання і що черга операторів буде порожньою в кінці виконання.
Це код-гольф, тому найкоротший код у байтах виграє.
Випробування
Для цих тестових випадків дублікат є "
, негативним є -
, додавання є +
, множення є ×
, і рівність є =
.
Input -> Output
1+2×3 -> 9
1"+"+ -> 4
2"××" -> 16
3"×+" -> 18
3"+×" -> 36
123"= -> 1 ("= always gives 1)
1+2=3 -> 1
1"=2+ -> 3
1-2-+ -> -3
-1-2+ -> 3 (hehe, the `-1` becomes `+1` at the `-` rather than making the `2` a `-1`)
+×"10 10 -> 200 (after the 10 is duplicated (duplication is delayed), 10 + 10 is performed and then 20 * 10, giving 200)
Правила
- Застосовуються стандартні лазівки
- Ви можете взяти офіційного перекладача будь-якого виправлення та передати його, якщо хочете. Чекайте, що втратите жахливо.
Вхід буде подано у вигляді рядка, а вихід у вигляді масиву, єдине ціле число, з подання рядка будь-якого. Ви можете припустити, що вхід буде містити лише пробіли, цифри та 5 обраних вами символів.
* насправді
0
і 1
?
×+"10 10
до тестових випадків чи будь-які інші приклади, які: 1) використання пробілу та 2) затримка використання оператора- дубліката (дві речі, які я цілком пропустив).