Files
snanosm/examples/detector.py
T

53 lines
1.5 KiB
Python

from typing import TypedDict
from snanosm.mealy import Machine, TransitionInputEnum
class Context(TypedDict):
count: int
position: int
matches: int
def dinc(context: Context):
context["count"] += 1
def dset(context: Context):
context["position"] = context["count"]
context["count"] += 1
def dprn(context: Context):
context["count"] += 1
print(f"SUBSTRING FOUND AT POSITION: {context['position']}")
context["matches"] += 1
# Detects the sequence AB in the string, printing the position and returning the amount of matches
def detector(input_string: str) -> int:
initial_context: Context = {
"count": 0,
"position": 0,
"matches": 0,
}
m = Machine(initial_context)
m.add_state("Q0", True, False)
m.add_state("Q1", False, False)
m.add_transition("A", "Q0", "Q1", lambda context: dset(context))
m.add_transition(TransitionInputEnum.MATCH_REST, "Q0", "Q0", lambda context: dinc(context))
m.add_transition("B", "Q1", "Q0", lambda context: dprn(context))
m.add_transition(TransitionInputEnum.MATCH_REST, "Q1", "Q0", lambda context: dinc(context))
for c in input_string:
m.process_input(c)
return initial_context["matches"]
if __name__ == "__main__":
print("== 1 ==")
n = detector("AAAAAAABAAAAAB")
print(f"Matches: {n}")
print("== 2 ==")
n = detector("AAAA")
print(f"Matches: {n}")
print("== 3 ==")
n = detector("ABCCBBACAB")
print(f"Matches: {n}")