Pythonで数独

Python数独
定式化して解くのに、入出力合わせて15行だ。

from pulp import *
m = LpProblem()
v = [[[LpVariable('v%d%d%d' % (i, j, k), cat = LpBinary) for k in range(9)] for j in range(9)] for i in range(9)]
with open('pulp-sudoku.txt') as fp:
	for i, j in [(i0, j0) for i0 in range(9) for j0 in range(9)]:
		if j == 0: s = fp.readline()
		if s[j].isdigit(): m += v[i][j][int(s[j]) - 1] == 1
		m += lpSum(v[i][j]) == 1
		m += lpSum(v[i][k][j] for k in range(9)) == 1
		m += lpSum(v[k][i][j] for k in range(9)) == 1
		m += lpSum(v[i / 3 * 3 + i1][i % 3 * 3 + j1][j] for i1 in range(3) for j1 in range(3)) == 1
m.solve()
for i in range(9):
	for j in range(9): print int(1 + sum([k * value(v[i][j][k]) for k in range(9)])),
	print