确定性有限自动机
* * * *
拉格朗日计划
* * * *
确定性有限自动机

确定性有限自动机(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)])