赞
踩
本关任务:编写一个异步状态转换器
状态机是一个对真实世界的抽象,而且是逻辑严谨的数学抽象,所以明显非常适合用在数字领域。可以应用到各个层面上,例如硬件设计,编译器设计,以及编程实现各种具体业务逻辑的时候。现在请你实现一个异步的有限状态机
一个有限状态机包含如下几个要素: 状态:系统所处的状态,在运行过程中又可以分为当前状态和下一阶段状态;一个状态机至少要包含两个状态。例如门,有 open 和 closed 两个状态。 事件:也可以理解为每一次运行的输入;事件就是执行某个操作的触发条件或者口令。对于门,“按下开门按钮”就是一个事件。 条件:根据输入事件执行的判定条件,条件是基于状态的,当前所处的每一种状态,都可以有自己对应的一套判定条件,来决定下一步进入哪一种状态;也就是从一个状态变化为另一个状态。例如“开不开门”根据有没有钥匙的条件。 动作:确定切换路径后,执行的附加操作。事件发生以后要执行动作。例如事件是“按开门按钮”,动作是“开门”。 变换:就是从一个状态变化为另一个状态。例如“开门过程”就是一个变换。 举例:街上的自动售货机中明显能看到状态机逻辑。假设有一台只卖2元一瓶的汽水的售货机,只接受五毛和一块的硬币。初始状态是”未付款“,中间状态有”已付款5毛“,”已付款1块“,”已付款1.5块“,”已足额付款“,四个状态。状态切换的触发条件是”投一块硬币“和”投5毛硬币“两种,”到达足额付款“状态,还要进行余额清零和弹出汽水操作。 在下图中,可以看到系统有 S1, S2, S3, S4 四个状态, 0 和 1 是状态机可以从一个状态到另一个状态的值,例如,只有当只为1的时候,S0可以转换到S1,当只为0的时候, S0可以转换到S2。这个转换的过程就是根据条件来切换状态,题目中,我们会输入一组数字作为事件,根据这一组数字,完成状态转换并输出相应的动作,从 S0 开始,叫做 初始状态,最后到 S4,叫做结束状态。
请你根据输入的一组数字,输出各个状态的转换过程。(状态一定从S0开始,到S4结束)。
为了完成本关任务,你需要掌握: 1.协程相关内容 2.asyncio模块
根据提示,在右侧编辑器补充代码,实现一个状态转换器。
平台会对你编写的代码进行测试:
测试输入: [1,0,0,1,1,1] 预期输出: Start Transition : S0 calling S1 value = 1 S1 calling S3 value = 0 S3 calling S1 value = 0 S1 calling S2 value = 1 S2 calling S3 value = 1 S3 calling S4 value = 1
- import asyncio
- list = []
-
-
- async def StartState(nums):
- '''
- 开始状态S0
- :param nums:输入的条件
- :return:
- '''
- #你的代码在这里#
- print('Start Transition :')
- list.append('S0')
- if next(nums) == 1:
- await State1(1,next(nums))
- else:
- await State1(0,next(nums))
-
- async def State1(transition_value: int, input_value):
- '''
- 状态S1
- :param transition_value:上一个状态到S1状态的条件,例如StartState转换到State1时,transition_value为1
- :param input_value:输入的条件nums
- :return: 当转换结束时,返回S1状态转换到其他状态的动作
- '''
- #你的代码在这里#
- i=len(list)
- list.append('S1')
- print('{0} calling {1} value = {2}'.format(list[i-1],list[i],transition_value))
- if input_value == 1:
- await State2(1,next(nums))
- else:
- await State3(0,next(nums))
-
- async def State2(transition_value: int, input_value):
- '''
- 状态S2
- :param transition_value:上一个状态到S2状态的条件,例如StartState转换到State2时,transition_value为0
- :param input_value:输入的条件nums
- :return:当转换结束时,返回S2状态转换到其他状态的动作
- '''
- #你的代码在这里#
- i=len(list)
- list.append('S2')
- print('{0} calling {1} value = {2}'.format(list[i - 1], list[i], transition_value))
- if input_value == 1:
- await State3(1,next(nums))
- else:
- await State1(0,next(nums))
-
- async def State3(transition_value: int, input_value):
- '''
- 状态S3
- :param transition_value:上一个状态到S3状态的条件,例如State2转换到State3时,transition_value为1
- :param input_value:输入的条件nums
- :return:当转换结束时,返回S3状态转换到其他状态的动作
- '''
- #你的代码在这里#
- i = len(list)
- list.append('S3')
- print('{0} calling {1} value = {2}'.format(list[i - 1], list[i], transition_value))
- if input_value == 1:
- await EndState(1)
- else:
- await State1(0,next(nums))
-
- async def EndState(transition_value: int):
- '''
- 结束状态S4
- :param transition_value:上一个状态到S4状态的条件
- :return:返回转换结束时的动作
- '''
- #你的代码在这里#
- i = len(list)
- list.append('S4')
- print('{0} calling {1} value = {2}'.format(list[i - 1], list[i], transition_value))
-
- if __name__ == "__main__":
- nums = iter(eval(input()))
- loop = asyncio.get_event_loop()
- loop.run_until_complete(StartState(nums))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。