Feat: made output function optional and added the example detector.py
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
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}")
|
||||
Reference in New Issue
Block a user