またもや数独の罠に

AI

こんにちは!サキナオコです^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^

コメント

  1. りおん より:

    たしかに、文字列だけだとちかちかしますよね。。
    GUI関係を使ってマス目に沿って表示とかも面白そうです。後はおっしゃる通りスプレッドシートに出力か。
    Pythonでなんでもできちゃいそうなのがすごいですよね。
    ぜひ頑張ってください~!

  2. まああ!!りおんさん!どうもありがとうございます!!*^o^*
    そうです。1個ずつのマス目に沿って表示、できたらいいな~と、
    また明日からpysimpleGUIでやってみようと思ってます。

    スプレッドシート、ですよね!
    Google Sheets APIがなんだか面倒臭そうなので及び腰です><
    でもやってみたらいいのかもなあと思ってます^^

    そうです!Pythonはとっても心強いお友達なのです!!^o^

タイトルとURLをコピーしました