内包表記をガシガシつかっています。
1〜3 問題の設定
4 指定位置x,yの数字が特定できれば設定する関数
5 指定位置の縦、横、そして数独の太枠の9つの値を重複なく取得
6 5行目で作成した中に存在していない1〜9の値を取得
7 6行目で値が1つならば(特定)数字を設定
8 10回ほど盤面を全検索
9 結果表示
ubuntu18.04に入っていたGNOME数独の初級問題を解いています。
中級には歯が立ちません。
テキスト
box=[['7', ' ', '1', ' ', ' ', ' ', '6', ' ', '8'], [' ', ' ', ' ', '2', '1', ' ', '7', ' ', ' '], ['3', '9', ' ', ' ', ' ', '8', ' ', ' ', '4'],\
[' ', ' ', '3', ' ', '8', ' ', ' ', '1', ' '], [' ', '6', ' ', '9', ' ', '1', ' ', '4', ' '], [' ', '1', ' ', ' ', '4', ' ', '8', ' ', ' '],\
['9', ' ', ' ', '6', ' ', ' ', ' ', '8', '1'], [' ', ' ', '6', ' ', '3', '9', ' ', ' ', ' '], ['1', ' ', '2', ' ', ' ', ' ', '9', ' ', '3']]
def putPoint(x,y):
a=set([box[y][x] for y in range(9)]+box[y]+[box[y//3*3+ly][x//3*3+lx] for lx in range(3) for ly in range(3)])
b=[i for i in "123456789" if not(i in a)]
if len(b)==1:box[y][x]=b[0]
[putPoint(x,y) for i in range(10) for y in range(9) for x in range(9) if box[y][x]==" "]
for y in range(9):print(box[y])