4 ms·
An even better example is with the coroutine FSM by the same author here https://github.com/arpitbbhayani/fsm/blob/master/divisibility-by-3.ipynb https://github
by glxxyz 7y ago
An even better example is with the coroutine FSM by the same author here https://github.com/arpitbbhayani/fsm/blob/master/divisibility-by-3.ipynb https://github.com/arpitbbhayani/fsm/blob/master/divisibilit... . It is cleaned up a lot by using functions instead of coroutines. Here each 'state' function takes a digit as input and returns the next state:
class Divisibility3FSM:
def __init__(self):
self.current_state = self.init
def send(self, digit):
self.current_state = self.current_state(digit)
def is_divisible(self):
return self.current_state == self.q0
def init(self, digit):
if digit in [0, 3, 6, 9]:
return self.q0
elif digit in [1, 4, 7]:
return self.q1
elif digit in [2, 5, 8]:
return self.q2
def q0(self, digit):
if digit in [0, 3, 6, 9]:
return self.q0
elif digit in [1, 4, 7]:
return self.q1
elif digit in [2, 5, 8]:
return self.q2
def q1(self, digit):
if digit in [0, 3, 6, 9]:
return self.q1
elif digit in [1, 4, 7]:
return self.q2
elif digit in [2, 5, 8]:
return self.q0
def q2(self, digit):
if digit in [0, 3, 6, 9]:
return self.q2
elif digit in [1, 4, 7]:
return self.q0
elif digit in [2, 5, 8]:
return self.q1