У позначенні префікса оператор виходить перед аргументами, тож ви можете уявити собі, що оператор викликає 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) затримка використання оператора- дубліката (дві речі, які я цілком пропустив).