random-stuff/code-guessing/automaton.py

75 lines
1.9 KiB
Python

import collections
def do_thing(s):
if len(s) == 1: return { s: True }
out = {}
for i, c in enumerate(s):
without = s[:i] + s[i + 1:]
things = do_thing(without)
out[c] = things
return out
def match(r, s):
print(r)
c = r
for i, x in enumerate(s):
print(x)
try:
c = c[x]
if c == True:
if i + 1 == len(s):
return True # full match
else:
return False # characters remain
except KeyError:
return False # no match
return False # incomplete match
def to_fsm(treeoid):
s_map = {}
count = 1
final = {}
alphabet = set()
def go(treeoid, current=0):
nonlocal count
s_map[current] = {}
for k, v in treeoid.items():
alphabet.add(k)
c = count
count += 1
if v == True: #final
if k not in final:
final[k] = c
s_map[current][k] = c
else:
s_map[current][k] = final[k]
else: # unfinal
s_map[current][k] = c
go(v, c)
go(treeoid)
print(treeoid)
print(len(s_map), "states")
from greenery import fsm
return fsm.fsm(
alphabet = alphabet,
states = set(s_map.keys()) | set(final.values()),
map = s_map,
finals = set(final.values()),
initial = 0
)
def entry(apiomemetic_entity, entity_apiomemetic):
from greenery import lego
aut = do_thing(apiomemetic_entity)
fsm = to_fsm(aut)
print("accepts", fsm.cardinality(), "strings")
regex = str(lego.from_fsm(fsm))
print(regex)
import re
return bool(re.match(regex, entity_apiomemetic))
if __name__ == "__main__":
print(entry("apioform", "beeeeese"))