确定性有限状态机(deterministicfinitestatemachine)是一种简单的计算模型,在计算机科学基础课程中被广泛用作自动机理论的入门课程。它是一个简单的模型,相当于正则表达式,它确定某个输入字符串是接受还是拒绝。Leaving some formalities aside,有限状态机的运行由以下部分组成:
机器上的运行从启动状态开始。读取输入字符串的每个字母;如果当前状态与对应于该字母的另一个状态之间存在转换,则当前状态将更改为新状态。读取最后一个字母后,如果当前状态是接受状态,则接受输入字符串。如果最后一个状态不是接受状态,或者某个字母在运行期间没有来自某个状态的对应拱门,则拒绝输入字符串。
注意:这个简短的描述远不是FSM的完整、正式的定义;Wikipedia's fine article是对这个主题的一个很好的介绍。
例如,下面的机器告诉从左到右读取的二进制数是否具有偶数0
s:
{0,1}
。(S1, 0) -> S2
、(S1, 1) -> S1
、(S2, 0) -> S1
和(S2, 1) -> S2
。用您选择的语言实现FSM。
FSM应接受以下输入:
<States> List of state, separated by space mark.
The first state in the list is the start state.
Accepting states begin with a capital letter.
<transitions> One or more lines.
Each line is a three-tuple:
origin state, letter, destination state)
<input word> Zero or more characters, followed by a newline.
例如,前面提到的以1001010
作为输入字符串的机器将被写为:
S1 s2
S1 0 s2
S1 1 S1
s2 0 S1
s2 1 s2
1001010
FSM的运行,写为<State> <letter> -> <state>
,然后是最终状态。示例输入的输出为:
S1 1 -> S1
S1 0 -> s2
s2 0 -> S1
S1 1 -> S1
S1 0 -> s2
s2 1 -> s2
s2 0 -> S1
ACCEPT
对于空输入''
:
S1
ACCEPT
注意:在您的注释之后,可以省略S1
行(显示第一个状态),并且还可以接受以下输出:
ACCEPT
对于101
:
S1 1 -> S1
S1 0 -> s2
s2 1 -> s2
REJECT
对于'10X'
:
S1 1 -> S1
S1 0 -> s2
s2 X
REJECT
250人的奖金将给予最短的解决方案。
有一个参考Python实现here。注意,对空字符串输入的输出要求已经放宽。
根据流行的需求,空输入字符串也可以接受以下输出:
ACCEPT
或者
REJECT
没有写在前一行的第一个状态。
有效的状态名是英文字母后跟任意数量的字母,_
和数字,非常像变量名,例如State1
,state0
,STATE_0
。
像大多数代码专家一样,您可以假设您的输入是正确的。
^{
cat test.fsm | sed -r solution.sed
sed -r solution.sed test.fsm
都给了我:
sed: -e expression #1, char 12: unterminated `s' command
所以算了吧如果有澄清的话,赏金会流向ruby解决方案。
Python2.7+,
201 192 187 181 179 175171个字符问题解决后(不需要在空输入上输出状态行),这里有一个新代码,它明显更短。如果您使用的是<;2.7版本,则不存在对dict的理解,因此请尝试
{c+o:s for o,c,s in i[1:-1]}
而不是dict((c+o,s)for o,c,s in i[1:-1])
以+5的价格。其测试输出:
上一条目(len 201):
在有人责骂我之前,我要道歉:代码行为与最初的按问题说明注释讨论略有不同。这是我的说明供讨论。
注意:虽然我喜欢最终状态的同一行上的ACCEPT/REJECT解析,但它可以通过在最后一行上添加
'\n'+
(5个字符)以+5个字符的价格移动到单独的位置(例如,想象结果将由只关心最后一行是ACCEPT还是REJECT的愚蠢脚本解析)。示例输出:
红宝石1.9.2-
178 190 182 177 153 161 158 154145个字符测试脚本
输出
所有输入以:
今天我感觉很复古,我选择的语言是IBM Enterprise Cobol-char count
24624078(抱歉,从面向屏幕的设备粘贴,尾随空格是一个悲惨的副作用):相关问题 更多 >
编程相关推荐