Stackylogic是一种基于逻辑的编程语言我提出了称取在0
的和1
为输入的,并输出一个单一的0
或1
在完成。
Stackylogic程序由只能包含三个字符的行组成,并且只能在01?
其中一行<
的末尾包含一个字符。行不能为空,并与该行<
必须至少有一个0
,1
或?
之前。
这是一个示例程序(如我将解释的那样),计算两个位的NAND:
1
?<
11
?
0
Stackylogic程序中的每一行都被视为一个堆栈,其底部在左侧,顶部在右侧。隐式地,在程序的第一行之前和最后一行之后有一个空堆栈(空行)。
的<
,我们称之为的光标,标记堆栈的运行Stackylogic程序时开始。Stackylogic程序的执行过程如下:
将顶部字符从光标当前指向的堆栈中弹出。
- 如果该字符为
?
,则提示用户输入a0
或a,1
并像该字符一样进行操作。 - 如果字符是
0
,则将光标向上移动一个堆栈(到当前行上方的行)。 - 如果字符是
1
,则将光标向下移动一个堆栈(到当前行下方的行)。
- 如果该字符为
如果光标移动到的堆栈为空,则输出从堆栈弹出的最后一个值(始终为a
0
或1
),然后结束程序。否则,如果光标移动到的堆栈不为空,请返回步骤1并重复该过程。
请注意,Stackylogic程序始终会结束,因为它们最终必须耗尽堆栈。
NAND范例
在NAND程序中,光标从以下位置开始?
:
1
?<
11
?
0
我们假设用户1
一旦输入,便输入a ?
,这意味着光标将向下移动,使程序如下所示:
1
11<
?
0
现在,平原1
位于游标堆栈的顶部。它会适当弹出,然后光标再次移动:
1
1
?<
0
现在假设用户输入0
的?
,这意味着将光标向上移动:
1
1<
0
同样,1
游标堆栈上还有a ,因此游标弹出并向下移动:
1
<
0
最后,游标堆栈为空,因此弹出最后一个值1
,输出,程序结束。
这是准确的NAND门,因为1 NAND 0
是1
。如果您愿意检查的话,这当然适用于其他三个两位输入。
或例子
此Stackylogic程序模拟“ 或”门:
?
?<
很容易看到,初始输入1
会将光标推到最后一行下面的隐式空堆栈,从而结束程序并输出1
刚刚输入的内容。
00
另一方面,对于输入,游标将进入顶部的隐式空堆栈,从而结束程序并输出最后一个0
要输入的内容。
挑战
编写一个将Stackylogic程序作为字符串接收并运行,打印或返回结果0
或的程序或函数1
。
在时?
,您可能会提示用户输入0
或1
,或者从您也将其作为输入的预设字符串0
s和中读取值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\?