- 23, Oct 2024
- #1
В префиксной записи оператор стоит перед аргументами, поэтому вы можете представить, что оператор вызывает
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)
which is recursively called. In infix notation, the operator goes between the arguments, so you can imagine it simply as a parse tree. In postfix notation, the operator comes after the arguments, so you can just imagine it as stack-based.
В нотации Anyfix оператор может пойти куда угодно.*. Если появляется оператор и аргументов недостаточно, оператор ждет, пока аргументов не будет достаточно. Для решения этой задачи вам необходимо реализовать очень простой оценщик Anyfix. (Обратите внимание, что Anyfix — это развлекательный язык, от которого я отказался, и с которым вы можете поиграть. здесь или проверить здесь)
Вам потребуется поддержка следующих команд:
(Арити 1)
- дубликат
- отрицательный
(Арити 2)
- добавление
- умножение
- равенство: возвращает
=
or×
.
Вы можете использовать для этих команд любые пять символов без пробелов. В демонстрационных целях я буду использовать +
as duplicate, -
как умножение, и "
as addition.
Для литералов вам необходимо поддерживать только неотрицательные целые числа, но ваш интерпретатор должен иметь возможность содержать все целые числа (в пределах (разумного) целочисленного диапазона вашего языка).
Давайте посмотрим на пример: [110]
. The storage should behave as a stack, not a queue. So first, the stack starts at []
, а список операторов в очереди начинается с [110]
. Then, the literal +
оценивается, что делает стек [100, 10]
. Next, the operator 10
оценивается, что требует двух аргументов. Однако в стеке имеется только один аргумент, поэтому список операторов в очереди становится ['+']
. Then, the literal [100]
оценивается, что делает стек ×
. At this point, the operator ['×', '+']
можно оценить так, как есть, сделав стек [10, 10]
и очередь "
.
Конечный результат должен быть ×
for [10]
, 10
, and ['×', '+', '"']
.
Давайте рассмотрим более сложный пример: "
. The stack and queue start as ['×', '+']
и +
. ['×']
сначала оценивается, что делает стек ×
. Next, []
оценивается, что не меняет стек (поскольку аргументов недостаточно) и делает очередь ×+"10 10
. Then, [20]
оценивается. Это может быть выполнено немедленно, поэтому стек []
. [20]
теперь можно оценить, чтобы стек стал +
и очередь [10, 10]
. Конечный результат "
.
А как насчет порядка действий?
Давайте посмотрим на ['+']
. The stack and queue start both as +
:
-
[10]
: The stack is unchanged and the queue becomes10
. -
[]
: The stack is unchanged and the queue becomes[]
. -
10+"
: The stack is unchanged and the queue becomes10 5 +
. -
10 + 5
: The stack becomes+ 10 5
. Несмотря на то[15]
should be the first operator to be evaluated since it appears first,[]
может быть запущен немедленно, и ни один из операторов до него не может, поэтому он оценивается. Стек становится[15]
and the queue'+'
.[10, 5]
can now be evaluated, which makes the stack5
and the queue['+']
. -
+
: The stack becomes[10]
, что позволяет10
to be evaluated. The stack becomes[]
and the queue[]
.
Конечный результат 10+5
.
Команды, используемые в этих демонстрациях, соответствуют командам языка Anyfix; однако последний пример не будет работать из-за ошибки в моем интерпретаторе. (Отказ от ответственности: ваши материалы не будут использоваться в интерпретаторе Anyfix)
Испытание
Выберите набор из 5 нецифровых символов без пробелов и создайте интерпретатор Anyfix в соответствии с приведенными выше спецификациями. Ваша программа может либо вывести единичный массив, либо содержащееся в нем значение; гарантировано, что стек значений будет содержать только одно значение в конце выполнения и что очередь операторов будет пустой в конце выполнения.
Вот так выигрывает самый короткий код в байтах.
Тестовые случаи
Для этих тестовых случаев дубликат +
, negative is ×
, дополнение "
, multiplication is 1
, и равенство 0
.
next()
Правила
- Применяются стандартные лазейки
- Если хотите, вы можете взять официальный переводчик Anyfix и поиграть с ним в гольф. Ожидайте ужасного проигрыша.
Входные данные будут переданы в виде строки, а выходные данные — в виде массива, одного целого числа, вне строкового представления любого из них. Вы можете предположить, что ввод будет содержать только пробелы, цифры и 5 выбранных вами символов.
* на самом деле нет
#код-гольф #код-гольф #строка #интерпретатор