"""Original bounded append-only Bloom exercise; no real records or actions."""
import hashlib,json
def positions(key):
 if type(key) is not str or not 1<=len(key)<=64:raise ValueError('one to64 codepoints required')
 return [int.from_bytes(hashlib.sha256(bytes([salt])+key.encode('utf-8')).digest(),'big')%16 for salt in [0,1]]
def add(bits,key):
 for p in positions(key):bits|=1<<p
 return bits
def maybe(bits,key):return all(bits&(1<<p) for p in positions(key))
def demo():
 members=['item-'+str(i) for i in [0,1,2,3,5]];exact=set(members);bits=0;trace=[]
 for x in members:
  old=bits;bits=add(bits,x);trace.append({'key':x,'positions':positions(x),'before':format(old,'016b'),'after':format(bits,'016b')})
 assert all(maybe(bits,x) for x in members)
 probes=[{'key':x,'positions':positions(x),'maybe':maybe(bits,x),'exact_member':x in exact} for x in ['other-'+str(i) for i in range(40)]]
 false=[x for x in probes if x['maybe'] and not x['exact_member']];assert false
 witness=None
 for deleted in members:
  damaged=bits
  for p in positions(deleted):damaged&=~(1<<p)
  victims=[x for x in members if x!=deleted and not maybe(damaged,x)]
  if victims:witness={'deleted_key':deleted,'cleared_positions':positions(deleted),'still_in_exact_set_but_bloom_negative':victims,'damaged_bits':format(damaged,'016b')};break
 assert witness
 rejected=[]
 for x in ['',True,'x'*65]:
  try:positions(x)
  except ValueError:rejected.append(repr(x))
  else:raise AssertionError('expected rejection')
 return {'scope':'original m16/k2 salted SHA256 mapping, no independent-hash or general probability claim','insertions':trace,'bits_final':format(bits,'016b'),'all_inserted_maybe_true':True,'probes':probes,'false_positives_this40':len(false),'false_positive_witness':false[0],'exact_fallback_decision':false[0]['key'] in exact,'unsafe_deletion_counterexample':witness,'append_only_same_hash_only':True,'invalid_inputs_rejected':rejected,'real_data_or_action':False}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=True,indent=2))
