こんにちは!サキナオコです^o^
今日も良い気候でした。
さて、最近また数独熱がちらちらとしております。
そして、どうしても解けない数独のためにまたPythonで候補の数字を入れていますが、
ふと、「ChatGPTに書いてもらったらどうだろう?」と思いつきました。
自分で書いたコードでは同じエリアの数字までは除外できておらず、完璧ではないのです。
でも、ChatGPTならできそう!
そして、お願いしてやってみました。
説明が悪かったのか、数独を解いてしまうコードも書いてくれたりしました。
で、結局、こちらが一番うまくいったコードです。
# 数独の元の数字を2次元リストとして入力
sudoku = []
for i in range(9):
row = list(map(int, input(f"数独の {i+1} 行目を入力してください(空欄は0で入力): ").split()))
sudoku.append(row)
# 空欄に候補の数字を入れる関数
def is_valid(num, row, col):
# 同じ数字が同じ行、同じ列、同じ3x3のブロック内にあるかチェック
for i in range(9):
if (sudoku[row][i] == num) or (sudoku[i][col] == num) or (sudoku[(row//3)*3 + i//3][(col//3)*3 + i%3] == num):
return False
return True
def solve_sudoku(sudoku):
def solve(row, col):
if row == 9:
return True
if col == 9:
return solve(row+1, 0)
if sudoku[row][col] != 0:
return solve(row, col+1)
for num in range(1, 10):
if is_valid(num, row, col):
sudoku[row][col] = num
if solve(row, col+1):
return True
sudoku[row][col] = 0
return False
solve(0, 0)
# 数独の元の数字を表示
print("数独の元の数字:")
for row in sudoku:
print(row)
# 候補の数字を入れる
for row in range(9):
for col in range(9):
if sudoku[row][col] == 0:
candidates = []
for num in range(1, 10):
if is_valid(num, row, col):
candidates.append(num)
sudoku[row][col] = candidates
# 結果を表示
print("候補の数字を入れた数独:")
for row in sudoku:
print(row)
ただですねえ、入力がスペースを入れなくてはいけなくて、めちゃ面倒です。
スペースを入れないで入力できるようにしてもらおうとしましたが、
いつものように泥沼へ。
結局もうスペースを狂ったように入れるしかないとあきらめました。
ああ、スペースを入れるコードを別に書くとか?
もう次回でいいかあ。
で出た答えがもう目がちらちらするんですよ!
[7, [4, 6, 8, 9], [1, 2, 4, 6, 9], [1, 4, 8], 3, [8, 9], [2, 4, 6, 9], 5, [1, 2, 9]]
[[1, 4, 6, 9], [3, 4, 6, 9], [1, 3, 4, 6, 9], 2, [1, 4, 5, 9], [5, 7, 9], 8, [1, 3, 4, 6, 7,
9], [1, 3, 9]]
[[1, 2, 4, 8, 9], [3, 4, 8, 9], 5, [1, 4, 7, 8], [1, 4, 9], 6, [2, 3, 4, 7, 9], [1, 3, 4, 7,
9], [1, 2, 3, 9]]
[5, [4, 6, 9], [2, 4, 6, 9], [1, 3, 6], 8, [2, 3], [3, 4, 9], [1, 3, 4, 9], 7]
[3, [4, 6, 7, 8], [4, 6, 7], 9, [1, 5, 6], [5, 7], [4, 5], 2, [1, 5, 8]]
[[4, 6, 9], [3, 4, 6, 7, 9], [3, 4, 6, 7, 9], 5, [2, 4, 6, 9], [2, 3, 8, 9], 1, [3, 6, 7, 8,
9], [2, 3, 8, 9]]
[[4, 6, 9], [3, 4, 5, 6, 7, 9], 8, [3, 4, 6], [2, 4, 6, 9], 1, [2, 3, 5, 6, 7, 9], [3, 6, 7,
9], [2, 3, 5, 9]]
[[1, 6, 9], 2, [1, 3, 6, 9], [3, 6, 8], 7, [3, 8, 9], [3, 5, 6, 9], [3, 6, 8, 9], 4]
ぎゃ~~ちらちらして目がまわるうう~~
これをマス目に入力できないかとChatGPTに再度お願いしてみました。
list_of_lists = [
[7, [4, 6, 8, 9], [1, 2, 4, 6, 9], [1, 4, 8], 3, [8, 9], [2, 4, 6, 9], 5, [1, 2, 9]],
[[1, 4, 6, 9], [3, 4, 6, 9], [1, 3, 4, 6, 9], 2, [1, 4, 5, 9], [5, 7, 9], 8, [1, 3, 4, 6, 7,
9], [1, 3, 9]],
[[1, 2, 4, 8, 9], [3, 4, 8, 9], 5, [1, 4, 7, 8], [1, 4, 9], 6, [2, 3, 4, 7, 9], [1, 3, 4, 7,
9], [1, 2, 3, 9]],
[[2, 8, 9], 1, [2, 7, 9], [3, 7], [2, 5], 4, [3, 5, 9], [3, 8, 9], 6],
[5, [4, 6, 9], [2, 4, 6, 9], [1, 3, 6], 8, [2, 3], [3, 4, 9], [1, 3, 4, 9], 7],
[3, [4, 6, 7, 8], [4, 6, 7], 9, [1, 5, 6], [5, 7], [4, 5], 2, [1, 5, 8]],
[[4, 6, 9], [3, 4, 6, 7, 9], [3, 4, 6, 7, 9], 5, [2, 4, 6, 9], [2, 3, 8, 9], 1, [3, 6, 7, 8,
9], [2, 3, 8, 9]],
[[4, 6, 9], [3, 4, 5, 6, 7, 9], 8, [3, 4, 6], [2, 4, 6, 9], 1, [2, 3, 5, 6, 7, 9], [3, 6, 7,
9], [2, 3, 5, 9]],
[[1, 6, 9], 2, [1, 3, 6, 9], [3, 6, 8], 7, [3, 8, 9], [3, 5, 6, 9], [3, 6, 8, 9], 4]
]
# 元のリストのリストを9つずつに分割する
sub_lists = [list_of_lists[i:i+9] for i in range(0, len(list_of_lists), 9)]
# 9×9のマス目に要素を配置して出力する
for rows in sub_lists:
for i in range(9):
print(rows[i][0], rows[i][1], rows[i][2], " | ", rows[i][3], rows[i][4], rows[i][5], " | ", rows[i][6], rows[i][7], rows[i][8])
print("--------------------")
ええ、出た答えをlist_of_listにはりつけるというアナログ手法です(今やってみたらlist_of_lists =sudokuでアナログ入力せずにいけました)けどね、結果こうなります。
7 [4, 6, 8, 9] [1, 2, 4, 6, 9] | [1, 4, 8] 3 [8, 9] | [2, 4, 6, 9] 5 [1, 2, 9]
[1, 4, 6, 9] [3, 4, 6, 9] [1, 3, 4, 6, 9] | 2 [1, 4, 5, 9] [5, 7, 9] | 8 [1, 3, 4, 6, 7,
9] [1, 3, 9]
[1, 2, 4, 8, 9] [3, 4, 8, 9] 5 | [1, 4, 7, 8] [1, 4, 9] 6 | [2, 3, 4, 7, 9] [1, 3, 4, 7,
9] [1, 2, 3, 9]
[2, 8, 9] 1 [2, 7, 9] | [3, 7] [2, 5] 4 | [3, 5, 9] [3, 8, 9] 6
5 [4, 6, 9] [2, 4, 6, 9] | [1, 3, 6] 8 [2, 3] | [3, 4, 9] [1, 3, 4, 9] 7
3 [4, 6, 7, 8] [4, 6, 7] | 9 [1, 5, 6] [5, 7] | [4, 5] 2 [1, 5, 8]
[4, 6, 9] [3, 4, 6, 7, 9] [3, 4, 6, 7, 9] | 5 [2, 4, 6, 9] [2, 3, 8, 9] | 1 [3, 6, 7, 8,
9] [2, 3, 8, 9]
[4, 6, 9] [3, 4, 5, 6, 7, 9] 8 | [3, 4, 6] [2, 4, 6, 9] 1 | [2, 3, 5, 6, 7, 9] [3, 6, 7,
9] [2, 3, 5, 9]
[1, 6, 9] 2 [1, 3, 6, 9] | [3, 6, 8] 7 [3, 8, 9] | [3, 5, 6, 9] [3, 6, 8, 9] 4
いいけどやっぱりちらちらするのよne!!
ああ~見づらい。あ、そ~だ!スプレッドシートにこれを移動させたらどうかな??
ChatGPTに聞いたところ、
「はい、可能です。Pythonのライブラリを使ってGoogleスプレッドシートにデータを出力することができます」だそうで、何やらGoogle Sheets APIを使用して、PythonコードからGoogleスプレッドシートにデータを書き込むという方法らしいんです。
ちょっと調べてみたら、面倒そう&数独の表示を変えるだけなのに大げさな気がしたので、いつか機会があったらやることにします。
それで、何かちらちらしない方法はないかな~と考えていたのですが、以前使った
PySimpleGUIなんかどうだろう??と思いつきました。
今度それでやってみようかと思っています^o^
コメント
たしかに、文字列だけだとちかちかしますよね。。
GUI関係を使ってマス目に沿って表示とかも面白そうです。後はおっしゃる通りスプレッドシートに出力か。
Pythonでなんでもできちゃいそうなのがすごいですよね。
ぜひ頑張ってください~!
まああ!!りおんさん!どうもありがとうございます!!*^o^*
そうです。1個ずつのマス目に沿って表示、できたらいいな~と、
また明日からpysimpleGUIでやってみようと思ってます。
スプレッドシート、ですよね!
Google Sheets APIがなんだか面倒臭そうなので及び腰です><
でもやってみたらいいのかもなあと思ってます^^
そうです!Pythonはとっても心強いお友達なのです!!^o^