nonIntersect,stripZeroes,isSolved,getColumn,getRow,getBox,addAnswer,sudogrid,sudopoints,basegrid,finalAnswers,twoOp=lambda ar1,ar2: list(set(ar1)-set(ar2)),lambda ar1: filter(lambda x: x!=0,ar1),lambda sudogrid: (not len(filter(lambda x: filter(lambda y: y==0,x),sudogrid)))*1,lambda i: sudogrid[i],lambda j: list((x[j] for x in sudogrid[0:9])),lambda i,j: list((y for x in sudogrid[i:i+3] for y in x[j:j+3])),lambda st: finalAnswers.append({"x":int(st[1])-1,"y":int(st[0])-1}),list(list(int(x) for x in raw_input().split(",")) for x in range(0,9)),list(list([] for y in range(0,9)) for x in range(0,9)),range(0,10),list({"x":int(x),"y":int(y)} for y,x in list(raw_input().split(",") for d in range(0,5))),lambda x,y: x #Ryan Wdef printAnswer(pt): print getRow(pt["x"])[pt["y"]]while isSolved(sudogrid)!=1 or map(printAnswer,finalAnswers)*False: list(sudogrid[x][y]!=0 or sudopoints[x].__setitem__(y,twoOp((nonIntersect(nonIntersect(nonIntersect(basegrid,getColumn(x)),getRow(y)),getBox(int(3*((x/3.0)-((x%3.0)/3.0))),int(3*((y/3.0)-((y%3.0)/3.0)))))),(len(stripZeroes(sudopoints[x][y]))==1 and sudogrid[x].__setitem__(y,sudopoints[x][y][0])))) for x,y in zip(list(x for x in range(0,9) for y in range(0,9)),list(y for x in range(0,9) for y in range(0,9))))