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