Этот вызов был опубликован как часть конкурс LotM апреле 2018 года.
Brain-Flak - это язык тьюринга и тарпита, который приобрел довольно большую известность здесь, на PPCG. Память о языке состоит из двух стеков, а «скрытый» третий стек был обнаружен на Wh е в мастере , что приводит к некоторым интересным новым способам мышления программы Brain-зенитной.
Итак, как насчет того, чтобы дать этому бедному скрытому третьему стеку больше видимости? Давайте создадим язык, в котором третий стек получит признание, которого он заслуживает! Здесь я представляю вам Третий Flak .
Язык
В Third-Flak есть только один стек, называемый третьим стеком. Операторы работают на третьем стек таким же образом , что они делают в Брейн-Flak, но здесь нет []
, {}
, <>
nilads и не {...}
монады (так только допустимые символы в программе третьего Flak являются ()[]<>
). Вот что делает каждый оператор (будут приведены примеры, представляющие третий стек со списком, где последний элемент является вершиной стека):
()
является единственным двухсимвольным оператором в Third-Flak. Увеличивает вершину третьего стека на 1. Пример:[1,2,3]
→[1,2,4]
(
,[
,<
: Все открытия скобки, которые не охвачены в предыдущем случае нажать0
на третий стек. Пример:[1,2,3]
→[1,2,3,0]
)
выталкивает два элемента из третьего стека и возвращает их сумму. Пример:[1,2,3]
→[1,5]
]
извлекает два элемента из третьего стека и возвращает результат вычитания первого из второго. Пример:[1,2,3]
→[1,-1]
>
выталкивает элемент из третьего стека. Пример[1,2,3]
→[1,2]
А вот и другие правила языка:
В начале выполнения третий стек содержит только один 0.
Запрещено иметь пустой
[]
или<>
внутреннюю программу (в любом случае они будут noops, если следовать семантике Third-Flak, но на самом деле они имеют другое значение в Brain-Flak, которое здесь невозможно воссоздать).Круглые скобки всегда должны быть сбалансированы, за исключением того факта, что завершающие закрывающие скобки в конце программы могут отсутствовать. Например,
[()<(()
допустимая программа третьего флага (и третий стек в конце программы будет[1,0,1]
).Программа может содержать только шесть разрешенных символов
()[]<>
. Программы гарантированно не являются пустыми.
Примечание: предыдущие правила подразумевают, что вам не придется сталкиваться с ситуациями, когда вам нужно выскочить из пустого стека.
Соревнование
Проще, напиши интерпретатор для Third-Flak. Ваша программа должна принимать в качестве входных данных программу третьего флага и возвращать в качестве выходных данных состояние третьего стека в конце программы.
Ваш выходной формат является гибким до тех пор, пока можно однозначно прочитать из него состояние третьего стека и одно и то же число всегда кодируется одинаково (это просто способ сказать, что любой выходной формат не является явным способом пытаться обмануть нормально).
Ваш выходной выбор может ограничить диапазон номеров, которыми вы можете управлять, если это не упрощает задачу (поскольку это будет лазейка по умолчанию ).
Контрольные примеры
Для каждого тестового случая первая строка является входной, а вторая строка выходным стеком, представленным как разделенный пробелами список чисел, где вершина стека является последним элементом.
[()<(()
0 1 0 1
[((((()()()()()))
0 0 0 5
((([()][()][()])))
-3
[<<(((()()()())(((((
0 0 0 0 0 4 0 0 0 0 0
[()]<(([()])><[()]
-1 0 -1
(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(())(())(()())(())(())(())(()())(()()()())(())(()()()()())(()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(())(())(()())(())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(())(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(()()())(())(()()())(())(())(())(()())(()()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(())(())(())(()()())(())(())(())(()())(())(()())(()()()())(())(())(()()()()())(()())(()())(())(()()())(())(())(())(())(()()())(()())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(()()()()())(())(()()())(())(())(()())(())(()()()()())(())(()()()()())(())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()()()())(())(()()()()())(())(())(())(()())(())(()()()()())(())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()()()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(())(()())(()()()())(())(())(()())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(()()())(())(())(()())(())(())(()()()()())(()()()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(()()()())(()()()())(()()
718 2
[()]
нарушается правило, согласно которому нам не нужно беспокоиться о выталкивании из пустого стекаe
находится здесь .Ответы:
Brain-Flak , 276 байт
Попробуйте онлайн!
Вы должны были знать, что это идет.
источник
Retina 0.8.2 ,
644846 байтПопробуйте онлайн! Выводит стек снизу вверх. Работает только с неотрицательными целыми числами, а последний контрольный пример слишком медленный, поэтому ссылка содержит только три контрольных примера. Объяснение: Стек неявно предшествует программе, поэтому он начинается с пустой строки, которая представляет один ноль.
()
Nilad превращаются в_
который используется для подсчета в Унарном, в то время как другие открытых скобках превратились в символы новой строки , которые толкают ноль в стек , поскольку они встречаются. Закрывающие скобки затем обрабатываются по одному, так что стек будет правильным;)
удаляет предыдущую строку, добавив сверху два элемента вместе,]
удаляет верхний элемент и соответствует его от предыдущего элемента в стеке , таким образом , вычитая его, и>
просто удаляет верхний элемент. Наконец стек преобразуется в десятичную. Изменить: Сохранено 2 байта благодаря @Leo.источник
$3
? (отличный ответ, так или иначе!)Python 3 ,
145 144 132 122 116 109104 байта-7 байт благодаря Лео!
И - 5 благодаря Линн!
Попробуйте онлайн!
Довольно стандартная реализация.Теперь не так читабельно. Я разочарован тем, что не смог найти более короткий способ проверки между начальными и конечными скобками.Некоторые попытки однострочников:
124 байта (анонимная функция):
115 байт (полная программа):
Добавить досадно дольше, чем простое назначение
источник
~-']>)'.index(i)
можно(2-ord(i)%5)
сохранить 4 байта.Рубин ,
9891 байтПопробуйте онлайн!
Мой исходный код работал по духу аналогично ответу Джона Кинга на Python, так что перед циклом просмотра исходных символов мы заменили все
()
подстроки другим символом в качестве отдельного оператора.Однако, по крайней мере в Ruby, оказалось, что гольфист не делает этого, а предпочитает немного более громоздкий подход. Здесь мы поддерживаем дополнительный индексатор,
i
отслеживающий нашу позицию в исходной строке, и всякий раз, когда встречается открывающая скобка, мы выполняем предварительную проверку, если наши текущие + следующие символыs[i,2]
образуют()
оператор. В этом случае мы нажимаем 1 вместо 0 на вершине стека и позволяем закрытию)
делать свою работу на следующем шаге.источник
05AB1E , 25 байтов
Попробуйте онлайн!
объяснение
источник
SOGL V0.12 , 34 байта
Попробуй здесь!
источник
R ,
182177 байтПопробуйте онлайн!
Возвращает стек, где верхняя часть стека является первой, а нижняя часть стека является последней.
Свопы
()
с ,7
а затем вычисляет кодовые точки по модулю 8 , чтобы получить различные числовые значения, которые легче и golfier для работы с чем строки.Работать с началом вектора в R лучше, поэтому мы строим стек таким образом.
Затем он видит
)
, или когдаk==1
он добавляет дополнительный ноль к вершине стека, так как его можно добавить и удалить.источник
CJam , 29 байт
Попробуйте онлайн!
источник
Цейлон,
285266 байтПопробуйте онлайн!
(Сохранено 19 байт благодаря предложению Льва.)
Отформатировано и прокомментировано:
Попробуйте онлайн!
источник