from ortools.sat.python import cp_model

model = cp_model.CpModel()
S = model.NewIntVar(0, 9, 'S')
E = model.NewIntVar(0, 9, 'E')
N = model.NewIntVar(0, 9, 'N')
D = model.NewIntVar(0, 9, 'D')
M = model.NewIntVar(0, 9, 'M')
O = model.NewIntVar(0, 9, 'O')
R = model.NewIntVar(0, 9, 'R')
Y = model.NewIntVar(0, 9, 'Y')

vars = [S, E, N, D, M, O, R, Y]
model.AddAllDifferent(vars)

# SEND + MORE == MONEY
model.Add(
  1000*S + 100*E + 10*N + D
  + 1000*M + 100*O + 10*R + E
  == 10000*M + 1000*O + 100*N + 10*E + Y
)

solver = cp_model.CpSolver()
if solver.Solve(model) == cp_model.OPTIMAL:
  print([f'{v}={solver.Value(v)}' for v in vars])

print(solver.ResponseStats())

solver.SearchForAllSolutions(model, cp_model.VarArraySolutionPrinter(vars))