Stackylogic - это язык программирования, основанный на логике, который я создал, который принимает 0
и вводит 1
и выводит один 0
или 1
после завершения.
Программа Stackylogic состоит из строк, которые могут содержать только три символа, 01?
а также ровно один <
в конце одной из строк. Линии не могут быть пустыми и линия с <
должна иметь по крайней мере один 0
, 1
, или ?
перед ним.
Вот пример программы, которая (как я объясню) вычисляет NAND из двух битов:
1
?<
11
?
0
Каждая строка в программе Stackylogic считается стеком , с нижней частью слева и верхней справа. Неявно, есть пустой стек (пустая строка) перед первой строкой в программе и после последней строки.
Элемент <
, который мы назовем курсором , помечает стек для запуска при запуске программы Stackylogic. Выполнение программы Stackylogic происходит следующим образом:
Удалите верхний символ из стека, на который в данный момент указывает курсор.
- Если это символ
?
, предложите пользователю ввести a0
или a1
и действуйте так, как если бы это был символ. - Если это символ
0
, переместите курсор на одну стопку вверх (на строку выше текущей строки). - Если это символ
1
, переместите курсор на одну стопку вниз (на строку ниже текущей строки).
- Если это символ
Если стек, в который перемещается курсор, пуст, выведите последнее значение, извлеченное из стека (всегда a
0
или1
), и завершите программу.В противном случае, если стек, в который перемещается курсор, не пуст, вернитесь к шагу 1 и повторите процесс.
Обратите внимание, что программы Stackylogic всегда заканчиваются, потому что они должны в конечном итоге исчерпать свои стеки.
Пример NAND
В программе NAND курсор начинается на ?
:
1
?<
11
?
0
Мы будем предполагать, что пользователь вводит a 1
после ?
нажатия, что означает, что курсор будет перемещаться вниз, делая программу похожей на это:
1
11<
?
0
Теперь равнина 1
находится на вершине стека курсора. Это правильно вытолкнуто, и курсор снова перемещается:
1
1
?<
0
Теперь предположим, что пользовательский ввод 0
для ?
, что означает, что курсор будет двигаться вверх:
1
1<
0
Опять же, a 1
находится в стеке курсора, поэтому курсор появляется и перемещается вниз:
1
<
0
Наконец, стек курсоров пуст, поэтому 1
выводится последнее значение , выводится, и программа завершается.
Это верно для ворот NAND, потому что 1 NAND 0
есть 1
. Это, конечно, работает для остальных трех двухбитных входов, если вы хотите проверить.
ИЛИ Пример
Эта программа Stackylogic имитирует ИЛИ ворота:
?
?<
Легко видеть, что начальный ввод 1
толкает курсор к неявному пустому стеку ниже последней строки, заканчивая программу и выводя только 1
что введенный.
С 00
другой стороны, для ввода курсора он направляется к неявному пустому стеку вверху, заканчивая программу и выводя последний, который 0
должен быть введен.
Вызов
Напишите программу или функцию, которая принимает программу Stackylogic в виде строки и запускает ее, печатая или возвращая полученный результат 0
или 1
.
После ?
этого вы можете запросить у пользователя ввод 0
или 1
, или прочитать значение из предустановленной строки 0
«и 1
», которую вы также принимаете в качестве ввода. (Это может быть другая строка ввода для вашей программы / функции, или вы можете просто предположить, что первая или последняя строка строки программы будет входным потоком).
Вы можете предположить, что программа и входные данные всегда правильно сформированы. При желании вы можете предположить, что входные программы поставляются с одним завершающим переводом строки (хотя помните, что в конце всегда есть неявный пустой стек).
Самый короткий код в байтах побеждает.
Больше примеров программ
ZERO
0<
ONE
1<
BUFFER
?<
NOT
1
?<
0
AND
?<
?
NAND
1
?<
11
?
0
OR
?
?<
NOR
1
?
00
?<
0
XOR(v1)
?
0
1?<
?
0
XOR(v2)
?
?<
11
?
0
XNOR(v1)
1
?
0?<
1
?
XNOR(v2)
1
?
00
?<
?
MEDIAN(v1)
1
???<
0
MEDIAN(v2)
?
1?<
??
1\???<\0
.
111\???????<\000
.
?\1?<\??
. В качестве альтернативы, вот симметричная 5-строчная реализация:?\?0\?<\?1\?