ChatGPT→pythonでナンプレを解くコードを生成してみた | 独学プログラマーHiroのパーツボックスblog

ChatGPT→pythonでナンプレを解くコードを生成してみた

chatGPT-pythonナンプレコード検証アイキャッチ画像 python
スポンサーリンク

いままではgoogleで検索して参照すること一択でしたが、最近注目を集めているChatGPTをコードや調査に使用する頻度が高くなってきました。

ChatGPTから生成されたコードはそのまま使えたり、多少の手直しで十分動く印象です。

今回は通称ナンプレ(ナンバープレイス)を解くコードをChatGPTで生成してそのままでも使えるか検証してみたいと思います。

ChatGPTにコード生成を依頼する

ChatGPTにログインする方法はwebに多数紹介されていると思いますので省略して、さっそくChatGPTの入力欄にコード生成の依頼を投稿します。

ChatGPTに依頼した画像

日本語で依頼してOKなんですが、「pythonでナンバープレイスゲームを解くプログラムコードを生成して」と依頼したのに「コンパイルするプログラムコードを生成して」という表記になってしまいました。おそらく日本語→英語→日本語に変換されているのでしょう。回答は問題ないと思いますので、気にせず続けます。

ChatGPTで生成されたコードが動くか検証

1分ぐらいでコードが生成されました。たまにエラーになることがあるので、その場合にはブラウザを更新したり「回答の再生成」することで回答が得られます。

実際に生成されたコードはこちら

def solve(board):
    for row in range(9):
        for col in range(9):
            if board[row][col] == 0:
                for num in range(1, 10):
                    if is_valid(board, row, col, num):
                        board[row][col] = num
                        if solve(board):
                            return True
                        board[row][col] = 0
                return False
    return True

def is_valid(board, row, col, num):
    for i in range(9):
        if board[row][i] == num or board[i][col] == num:
            return False

    row_start = (row // 3) * 3
    col_start = (col // 3) * 3
    for i in range(3):
        for j in range(3):
            if board[row_start + i][col_start + j] == num:
                return False
    return True

if __name__ == "__main__":
    board = [[5, 3, 0, 0, 7, 0, 0, 0, 0],
             [6, 0, 0, 1, 9, 5, 0, 0, 0],
             [0, 9, 8, 0, 0, 0, 0, 6, 0],
             [8, 0, 0, 0, 6, 0, 0, 0, 3],
             [4, 0, 0, 8, 0, 3, 0, 0, 1],
             [7, 0, 0, 0, 2, 0, 0, 0, 6],
             [0, 6, 0, 0, 0, 0, 2, 8, 0],
             [0, 0, 0, 4, 1, 9, 0, 0, 5],
             [0, 0, 0, 0, 8, 0, 0, 7, 9]]

    if solve(board):
        for row in board:
            print(row)
    else:
        print("No solution exists")

実際に実行したところ下記のように回答が一瞬で表示されました

ナンバープレイスの解の画像

GUIで入力できるように依頼してみた

毎回コードの中に数値を入れるのはめんどくさいので、GUIで入力できるコードを生成するように依頼してみました。

ChatGPTは以前のやり取りを記憶しているので、人に依頼するときのように前のやり取りの続きとして依頼できます。

GUIのコードを生成するように依頼したときの画像

こちらのコードも約1分程度で生成されました。

実際に生成されたコードはこちら

import tkinter as tk

class NumberPlaceSolver:
    def __init__(self, master):
        self.master = master
        self.board = [[0 for _ in range(9)] for _ in range(9)]
        self.entries = []
        for i in range(9):
            row = []
            for j in range(9):
                entry = tk.Entry(width=2)
                entry.grid(row=i, column=j)
                row.append(entry)
            self.entries.append(row)

        solve_button = tk.Button(text="Solve", command=self.solve)
        solve_button.grid(row=9, column=0, columnspan=9, pady=5)

    def solve(self):
        for i in range(9):
            for j in range(9):
                try:
                    self.board[i][j] = int(self.entries[i][j].get())
                except ValueError:
                    self.board[i][j] = 0

        if self.solve_board(self.board):
            for i in range(9):
                for j in range(9):
                    self.entries[i][j].delete(0, tk.END)
                    self.entries[i][j].insert(0, str(self.board[i][j]))
        else:
            tk.messagebox.showinfo("No solution", "No solution exists")

    def solve_board(self, board):
        for row in range(9):
            for col in range(9):
                if board[row][col] == 0:
                    for num in range(1, 10):
                        if self.is_valid(board, row, col, num):
                            board[row][col] = num
                            if self.solve_board(board):
                                return True
                            board[row][col] = 0
                    return False
        return True

    def is_valid(self, board, row, col, num):
        for i in range(9):
            if board[row][i] == num or board[i][col] == num:
                return False

        row_start = (row // 3) * 3
        col_start = (col // 3) * 3
        for i in range(3):
            for j in range(3):
                if board[row_start + i][col_start + j] == num:
                    return False
        return True

if __name__ == "__main__":
    root = tk.Tk()
    solver = NumberPlaceSolver(root)
    root.mainloop()

GUI入力できるコードの動作検証

実際に実行してみます。

GUIの画像

9×9マスで入力ができるウィンドウが表示されました。ちょっとサイズが小さいが・・・

実際に数字を入力してsolveボタンを押して解を求めてみます

GUIバージョンで解を求めた画像

こちらも一瞬で解が表示されました。

ルールを満たしていない場合

ルール上、おかしい数値を入力した場合はどうなるのでしょうか?

ありえない入力の場合の画像

残念ながらいくら待ってもエラーも出ず実行が続きました。

検証結果

GUIなしのコードもGUI入力のコードもルールに従った入力であれば問題なく動作しました。

GUIの部分は使い勝手が良いとはいいがたいですが、動作的には問題ありませんでした。

1分ぐらいでエラーが出ず実際に動くコードが生成されるので、ChatGPT有効活用するとかなり作業効率がアップできると感じました。

大枠のコードはChatGPTで生成し、細かい例外処理や使い勝手の部分は人間が微調整することで十分実用的なアプリケーションができると思います。

皆さんもChatGPT使ってみてください。

この記事以外にもpythonの実際に動くコードを公開していますのでそちらの記事も読んでいただけると嬉しいです。

コメント

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