1import z32import sys34if len(sys.argv) != 2:5 print("usage: magic_square <SIZE>")6 exit(1)78size = int(sys.argv[1])9if size < 3:10 print("size must be >= 3")11 exit(1)1213s = z3.Solver()1415vars = []16for i in range(0, size):17 row = []18 for j in range(0, size):19 v = z3.Int(f"{i}{j}")20 s.add(v >= 1)21 row.append(v)22 vars.append(row)2324for i in range(0, size):25 for j in range(0, size):26 for k in range(0, size):27 for l in range(0, size):28 if i == k and j == l:29 continue30 s.add(vars[i][j] != vars[k][l])3132# rows33exps = []34for i in range(0, size):35 exp = vars[i][0]36 for j in range(1, size):37 exp = exp + vars[i][j]38 exps.append(exp)3940# cols41for j in range(0, size):42 exp = vars[0][j]43 for i in range(1, size):44 exp = exp + vars[i][j]45 exps.append(exp)4647# diags48one = vars[0][0]49two = vars[0][2]50for i in range(1, size):51 one = one + vars[i][i]52 two = two + vars[i][size - i - 1]5354exps.append(one)55exps.append(two)5657for i in range(0, len(exps) - 1):58 s.add(exps[i] == exps[i + 1])5960if s.check():61 model = s.model()62 for i in range(0, size):63 for j in range(0, size):64 print("{}\t".format(model[vars[i][j]]), end="")65 print()66else:67 print("Model wasn't satisfyable")