def isvalidpoint ((i,j), size):
return (i>=0)&(i<size)&(j>=0)&(j<=i)
def weight ((i0,j0), (i1,j1), size):
if (i0,j0) == (i1,j1):
return len(neartr((i0,j0),size))*2
if (j0==0)&(j1==0)|((i0-j0)==0)&((i1-j1)==0)|(i0==size-1)&(i1==size-1):
return 1
return 2
def isvalidtr (tr, size):
return reduce (lambda b, point: b & isvalidpoint (point, size), tr, True)
def neartr ((i,j), size):
return filter (lambda tr: isvalidtr(tr, size), [((i,j), (i,j-1), (i-1,j-1)), ((i,j), (i-1,j-1), (i-1,j)), ((i,j), (i-1,j), (i,j+1)), ((i,j), (i,j+1), (i+1,j+1)), ((i,j), (i+1, j+1), (i+1,j)), ((i,j), (i+1,j), (i,j-1))])
def weights ((i,j),size):
return map(lambda (i0,j0): (weight((i,j),(i0,j0), size)*1/12, pointtonom((i0,j0))),
filter (lambda point: isvalidpoint(point, size), [(i,j), (i,j-1), (i-1,j-1), (i-1,j), (i,j+1), (i+1, j+1), (i+1,j)]))
def pointtonom ((i,j)):
return i*(i+1)/2+j