В префиксной нотации оператор стоит перед аргументами, так что вы можете себе представить, что оператор вызывает 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) откладывают использование оператора дубликата (две вещи, которые я полностью пропустил).Ответы:
JavaScript (ES6),
204203200 байтВозвращает целое число.
Используемые символы:
+
: дополнение*
: умножение#
: равенствоd
: дубликат-
: отрицательныйКонтрольные примеры
Показать фрагмент кода
Отформатировано и прокомментировано
источник
-1+-2
. Возвращает 3 вместо -3.-
должен быть применен-1
немедленно.-
будет идти с,2
так как он идет после другого оператора. Возможно, @HyperNeutrino может уточнить. Отрицательный оператор может быть неоднозначным в некоторых ситуациях.JavaScript (ES6),
162152143150 байтСлегка разгульный
объяснение
Я использую
*
для умножения иR
для дублирования. Другие операторы такие же, как в вопросе.N
становится массивом чисел (включая дубликаты).replace
Обрабатывает случай , когда отрицательный знак приходит после того, как числа. Например, она будет меняться1-
в- 1
и-1-
к- -1
.Внутри
eval
,s.match
создает массив бинарных операторов. Обратите внимание, что это всегда будет иметь на один элемент меньше, чемN
.Результатом функции является
eval
отображение чисел и операторов.Вот что
eval
написано для каждого из тестовых случаев:Оператор запятой в выражении JavaScript возвращает результат его последнего выражения, поэтому
map
автоматически возвращает пригодное для использования выражение.+
Знак необходим , прежде чемeval
изменить ,true
чтобы1
иfalse
в0
.Использование
R
в качестве переменной и оператора дубликата значительно упрощаетmap
подвыражения.Тестовые случаи:
Показать фрагмент кода
источник
replace
работает как задумано. Это возвращает3
для,-1+--2
и я думаю, что1
это будет правильно (1
изменения подписывают три раза, прежде чем есть второй аргумент для+
доступных, в результате-1 + 2
).JavaScript,
321311 байтПопробуйте онлайн!
Пять символов такие же, как в вопросе, за исключением
*
умножения.Скрипт сжимается с помощью RegPack . Исходный сценарий сохраняется в переменной
_
после оценки.источник
-1+-2
. Возвращает 3 вместо -3.-3
вместо3
?-1 + -2
есть-3
, но должен ли он быть проанализирован как--1 + 2
вместо?3
. Прежде чем2
даже прийти в стек, второй-
оценивается, и, следовательно, у нас есть,1 2 +
что действительно3
. Ах, и, вероятно, вы тоже должны отредактировать свой ответ.Haskell , 251 байт
Попробуйте онлайн! Используются следующие символы:
a
для сложения,m
для умножения,q
для равенства,D
для дублирования иN
для отрицания. (Я хотел использоватьe
для равенства, но столкнулся с проблемой, котораяlex
разбирает2e3
как число.) Пример использования:(#([],[])) "2a3 4m"
урожайность20
.источник
6502 машинный код (C64), 697 байт
Онлайн демо
Использование
sys49152
, затем введите выражение anyfix и нажмите клавишу возврата.*
, все остальные, как предложено.Вот читаемый исходный код ассемблера в стиле ca65 .
источник
VB.NET (.NET 4.5)
615576 байт-39 байтов благодаря Феликсу Пальмену, изменив
\r\n
на\n
Требуется
Imports System.Collections.Generic
(включено в число байтов)Точкой входа является функция
A
, которая принимает строку в качестве входных данных и возвращает aStack(Of Long)
.Условные обозначения:
+
*
=
-
d
Обзор:
Функция
A
принимает входные данные и токенизирует их. Он используетLong?
промежуточный итог для многозначных целых чисел, чтоNothing
означает , что мы в настоящее время не читаем целое число.подпрограмма
E
берет стек целых чисел и очередь операторов и оценивает нотацию anyfix. Он вызывает себя рекурсивно, пока не останется никаких действий.Я объявляю глобальные параметры сразу, чтобы сохранить байты как при объявлении, так и при передаче параметров.
Возвращаемое значение из
A
задается путем присвоения значения соответствующей переменнойA
.VB
True
эквивалентен-1
, так что операция должна отменить результат, чтобы получить правильное значение.Попробуйте онлайн!
источник
Imports
, я получаю количество байтов только576
- не могли бы вы подсчитать?\r\n
вместо\n
, так что вот где расхождение.