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\?