确定性有限自动机
确定性有限自动机(determinstic finite automata,简称DFA)是一种总状态数有限的自动机,每一种当前状态和合法的输入字符都唯一决定了其下一个状态(即确定性)。
本题中的每组输入都包括两部分,前若干行是一张描述该DFA的表格,最后一行输入字符串,该字符串以引号括起,如下所示:
a b c d e f
> 0 0 0 0 1 0 0
1 0 0 0 1 0 2
2 3 0 0 1 0 0
F3 3 3 3 3 3 3
"adbacadafad"
上例的表格中包含了如下信息:
共有四种状态,分别是0, 1, 2, 3。
共有六种合法的输入字符,分别是a, b, c, d, e, f。
行列交汇处的数字表示当前状态(行)和当前输入字符(列)所对应的下一个状态。例如当前状态为0,输入字符为d,则下一个状态为1。
标有>的是初始状态。
标有F的是最终状态(也叫接受状态)。
因此,上例的初始状态为0,先读入a,状态转移为0,再读入d,状态转移为1,再读入b,状态又转移为0。。。以此类推,最后结束于状态1,并不是接受状态。
本题的输入数据符合以下规范:
每个自动机的总状态数不超过10个,且总是以0到9之间的数字表示。
合法的输入字符可以是a到z之间的小写英语字母或0到9之间的数字。
初始状态有且只有一个。
接受状态可能有多个,也可能没有。
输入字符串中不会出现非法字符。
请根据输入数据计算出最后的状态,并输出最后的状态(数字)和是否接受(是接受状态的输出“Accept”,否则输出“Reject”),中间以空格隔开。例如上例最后的输出应为1 Reject。
本题难度:
解答
把输入数据转化为列表,反复套用查找函数定位即可。
最终代码有五行。
代码长度:202字节 vs. 全站第一:147字节。
import sys
for a in sys.argv[1:]:
b=a.split("\n");s=a[a.find(">")+2]
for i in b[-1][1:-1]:s=b[[r[2]for r in b].index(s)][b[0].find(i)]
print(s,["Reject","Accept"][any(r[r.find(s)-1]=="F"for r in b)])