В префиксной нотации оператор стоит перед аргументами, так что вы можете себе представить, что оператор вызывает next()
рекурсивный вызов. В инфиксной нотации оператор идет между аргументами, поэтому вы можете представить его просто как дерево разбора. В постфиксной нотации оператор следует за аргументами, так что вы можете просто представить его как основанный на стеке.
В обозначении anyfix оператор может пойти куда угодно * . Если оператор обнаруживается и аргументов не хватает, оператор ждет, пока аргументов не будет достаточно. Для этого вам нужно внедрить очень простой оценщик anyfix. (Обратите внимание, что anyfix - это развлекательный язык, от которого я отказался, с которым вы можете поиграть здесь или проверить здесь )
Вам нужно будет поддерживать следующие команды:
(Arity 1)
- дубликат
- отрицательный
(Arity 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; однако последний пример не будет работать из-за ошибки в моем интерпретаторе. (Отказ от ответственности: Ваши материалы не будут использоваться в интерпретаторе 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)
правила
- Применяются стандартные лазейки
- Вы можете взять официального переводчика anyfix и поиграть в гольф, если хотите. Ожидайте, чтобы потерять ужасно.
Входные данные будут представлены в виде строки, а выходные данные - в виде массива, одного целого числа, из строкового представления любого из них. Вы можете предположить, что ввод будет содержать только пробелы, цифры и 5 выбранных вами символов.
* не совсем
0
а 1
?
×+"10 10
в тестовые наборы или любые другие примеры, которые 1) используют пробелы и 2) откладывают использование оператора дубликата (две вещи, которые я полностью пропустил).