作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关闭。这个问题需要更多 focused .它目前不接受答案。
7年前关闭。
锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或交互。
我刚刚尝试创建最小的语言解释器。你想加入并尝试吗?
游戏规则:
eval()
, exec()
或类似的。 最佳答案
Python,250 字节。
这个比 ilya n. 的 Python 解决方案要长一些,但是语言更容易掌握。这种语言中的每个命令(我称之为 Kaputt,德语中的“ splinter ”)都是一个字节。定义了以下 6 个命令:
0
: 将零压入堆栈 1
: 将一个压入堆栈 I
:(如果)从堆栈中弹出一个值(必须为零或一)。运行以下代码块(直到“i
”),如果它是一个;如果它是零,则跳过该 block 。 i
: (endif) 结束 if block ,如果 block 没有运行,则压入 1(因为“I
”弹出一个零)。有关后者的解释,请参见下文。 D
: (def) 将要定义的函数的名称从堆栈中弹出(见下文)并将后面的 block (直到“d
”)绑定(bind)到该名称。 d
: (enddef) 结束函数定义。 D
立即使用。 . i
的事实(endif) 当且仅当相应的 if block 未运行允许以下类似于 if/else/endif 结构的惯用语时才插入一个:
# [code that left a one or zero on the stack]
I # abbreviated "(" below
# [code to be run if it was a one]
0iI # abbreviated "/" below
# [code to be run if it was a zero]
1iIi # abbreviated ")" below
# [continuing...]
( / )
上文提到的。
<D(/)d
<
(pop) 从堆栈中弹出一个值而不使用它做任何事情。
&D((1/0)/<0)d
&
(and) 弹出堆栈的两个值,如果两个值都是 1,则压入 1,否则压入 0。
~D((11/10)/(01/00))d
~
(swap) 交换栈顶的两个值。
RD(R/<)d
R
(remove) 递归地从堆栈顶部删除所有值,然后再删除两个值(其中顶部的值应该为零)。
def i(p,S,F=0):
A=S.append
F=F or{}
C=0
k=[]
for c in p:
h=0in k
if c=="d":C=0
elif C!=0:C+=[c]
elif c=="I":k+=[int(h or S.pop())]
elif c=="i":k.pop()or A("1")
elif 1-h:
if c=="D":C=F[S.pop()]=[]
else:i(F.get(c)or A(c)or"",S,F)
i()
期望合法的 Kaputt 代码。测试用例:
script = "<D(/)d" # < = pop
script += "&D((1/0)/<0)d" # & = and
script += "~D((11/10)/(01/00))d" # ~ = swap
script += "RD(R/<)d" # R = remove
script += "|D(<1/(1/0))d" # | = or
script=script.replace("(","I")
script=script.replace("/","0iI")
script=script.replace(")","1iIi") # ( and / and ) are no real commands of the language.
S=[]
i(script+"1111010111111111R",S)
assert S == ["1","1","1","1","0"]
S=[]
i(script+"00&",S)
assert S == ["0"]
S=[]
i(script+"01~",S)
assert S == ["1","0"]
S=[]
i(script+"00|",S)
assert S == ["0"]
S=[]
i(script+"01|",S)
assert S == ["1"]
script = """
inc D
(
(
0 0
/
1 0
)
/
1
)
d
""".replace("(","I").replace("/","0 i I").replace(")","1 i I i").split()
inc
增加堆栈顶部的两位数(顶部的 LSB)。
for n in xrange(4):
S=[]
i(script + [str((n & 2)/2), str(n & 1), "inc"], S)
assert S == [str(((n+1) & 2)/2), str((n+1) & 1)]
关于computer-science - 创建最短的图灵完备解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1053931/
我是一名优秀的程序员,十分优秀!