53 lines
1.5 KiB
Python
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}")
|