尝试实现DFA,但代码产生错误

时间:2018-02-12 16:46:52

标签: python dfa

代码: -

#Shortest DFA implementation in Python
S,D,F=input()
s=1
for c in S:s=D[s,c]
print(["Not a chance!","Accepted!"][F&s>0])

输入: - 输入是字符串S的三倍,增量函数D和最终状态掩码F.我用幂2对每个状态进行编号,因此F只是每个接受状态的OR。 D是来自(州,输入字符)的地图 - >状态。

示例输入(接受以b结尾的所有字符串):

'abab',{(1,'a'):1,(1,'b'):2,(2,'a'):1,(2,'b'):2},2

输出: -

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-32-506f09a31940> in <module>()
      1 #Shortest DFA implementation in Python
----> 2 S,D,F=input()
      3 s=1
      4 for c in S:s=D[s,c]
      5 print(["Not a chance!","Accepted!"][F&s>0])

ValueError: too many values to unpack (expected 3)

同样,以下代码用于实现NFA。但即使在添加eval()之后,它也会抛出不同类型的错误。代码如下: -

#Shortest NFA implementation
S,D,F=eval(input())
s=1
for c in S:
 t,s=s,0
 for a,b in D[c]:s|=t/a%2*b
print(["Not a chance!","Accepted!"][F&s>0])

输入: - 我们像以前一样将州列为2的权力。 D是从输入字符到由该字符标记的转换列表的映射。

示例输入(接受以b结尾的所有字符串):

'abab',{'a':[(1,1)],'b':[(1,1),(1,2)]},2

获得的输出是: -

'abab',{'a':[(1,1)],'b':[(1,1),(1,2)]},2
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-34-7e5418d2d6fc> in <module>()
      4 for c in S:
      5  t,s=s,0
----> 6  for a,b in D[c]:s|=t/a%2*b
      7 print(["Not a chance!","Accepted!"][F&s>0])

TypeError: unsupported operand type(s) for |=: 'int' and 'float'

请告诉我上述代码中所需的必要但极少的修改,以便它成功执行并产生所需的输出。

1 个答案:

答案 0 :(得分:3)

此代码在Python 2中有效,而不是在Python 3中有效。我怀疑在使用Python 3时,代码实际上是为Python 2设计的。{2}中的input不仅从输入中读取字符串,但它也执行eval语句,这意味着它将获取字符串并将其转换为Python语法。 Python 3中的input返回一个你输入的字符串。如你在Python 2中看到的那样<div style="position: fixed; width:100%; height: 30%; left:0%; top: 0%; background: black; display: flex; justify-content: space-around; text-align: center; color: white"> <div> <div style="font-size: 17px">Info A</div> <div style="font-size: 29px;" id="text">text1</div> </div> <div> <div style="font-size: 17px">Info B</div> <div style="font-size: 29px;">text2</div> </div> <div> <div style="font-size: 17px">Info C</div> <div style="font-size: 29px;">text3</div> </div> </div> <br><br><br><br> <input onclick="document.getElementById('text').innerHTML+='.'" type="button" value="click">不再执行了。要模仿你在Python 2中看到的内容,你需要运行{{1}在eval

之上
eval

修改

使用您正在运行的新代码,罪魁祸首是循环中的除法运算:input。这默认返回一个浮点数,而在Python 2中,如果In [1]: S,D,F = eval(input()) 'abab',{(1,'a'):1,(1,'b'):2,(2,'a'):1,(2,'b'):2},2 In [2]: S Out[2]: 'abab' In [3]: D Out[3]: {(1, 'a'): 1, (1, 'b'): 2, (2, 'a'): 1, (2, 'b'): 2} In [4]: F Out[4]: 2 t/a都是整数,它将返回一个整数。您必须小心在Python 3环境中运行Python 2代码。只需将t包裹在a来电中:t/a

int

我最后要注意的是在Python 3环境中非常小心地运行Python 2代码。如果可能,请在其设计的环境中运行代码。如果没有,这个从Python 2到Python 3的成语的有用比较指南应该有所帮助:http://python-future.org/compatible_idioms.html。特别是: