fork download
  1. import itertools as it,re
  2. I=isinstance
  3. def t(q):
  4. if I(q,str):yield q;return
  5. if all(I(i,str)for i in q):yield from q;return
  6. yield from map(''.join,it.product(*[[j for k in i for j in t(k)]for i in q]))
  7. def p(s):
  8. q=[];f=0
  9. while s:
  10. if(n:=s[0])==')':return s[1:],q
  11. if'('==n:
  12. s,v=p(s[1:])
  13. if f:q[-1]=(q[-1],v);f=0
  14. else:q+=v
  15. elif'*'==n:q[-1]=[*q[-1],''];s=s[1:]
  16. elif'|'==n:f=1;s=s[1:]
  17. else:
  18. v=re.findall('^[10ε]+',s)[0];s=s[len(v):];v=[''.join([['',i][i in'10']for i in v])]
  19. if f:q[-1]=[*q[-1],*v];f=0
  20. else:q+=v,
  21. return s,q
  22. f=lambda a,b:all(i in k for i in[*t(p(a)[1])]if len(i)<=max(map(len,k:=[*t(p(b)[1])])))
  23.  
  24. s="""
  25. (0|1)*, (0(1*))*, False
  26. 0(0*)1(1*), (0*)(1*), True
  27. ((10)|(01)|0)*, (1001)*0, False
  28. 0, 1, False
  29. 1(1*), (1|ε)*1, True
  30. 10((10)*), 1((01)*)0, True
  31. ε*, ε, True
  32. """
  33. for i in filter(None, s.split('\n')):
  34. a,b,c = i.split(', ')
  35. assert f(a,b)==[False, True][c=='True']
Success #stdin #stdout 0.12s 15440KB
stdin
Standard input is empty
stdout
Standard output is empty