|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- import re
- import sys
-
-
- def solve_sudoku(string):
- known = [(i, v) for i, v in enumerate(string) if v != '0']
- solved, = map(dict, solve(X, Y, known))
- return ''.join(solved[i] for i in range(81))
-
-
- def solve(X, Y, solution):
- for choice in solution:
- X = select(X, Y, choice)
-
- for solution in complete(X, Y, solution):
- yield solution
-
-
- def select(X, Y, choice):
- fulfilled = Y[choice]
- excluded = {y for x in fulfilled for y in X[x]}
- return {x: ys - excluded for x, ys in X.items() if x not in fulfilled}
-
-
- def complete(X, Y, solution):
- if not X:
- yield solution
- else:
- for choice in min(X.values(), key=len):
- yield from complete(select(X, Y, choice), Y, solution + [choice])
-
-
- Y, X = {}, {}
- for i in range(81):
- r = i // 9
- c = i % 9
- b = r // 3 * 3 + c // 3
- for v in '123456789':
- choice = (i, v)
- Y[choice] = {('p', i), ('r', r, v), ('c', c, v), ('b', b, v)}
- for x in Y[choice]:
- X.setdefault(x, set()).add(choice)
-
-
- text = sys.stdin.read()
- strings = re.split(r'Grid \d\d', text.replace('\n', ''))[1:]
- print(sum(int(solve_sudoku(string)[:3]) for string in strings))
|