いままではgoogleで検索して参照すること一択でしたが、最近注目を集めているChatGPTをコードや調査に使用する頻度が高くなってきました。
ChatGPTから生成されたコードはそのまま使えたり、多少の手直しで十分動く印象です。
今回は通称ナンプレ(ナンバープレイス)を解くコードをChatGPTで生成してそのままでも使えるか検証してみたいと思います。
ChatGPTにコード生成を依頼する
ChatGPTにログインする方法はwebに多数紹介されていると思いますので省略して、さっそく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は以前のやり取りを記憶しているので、人に依頼するときのように前のやり取りの続きとして依頼できます。
こちらのコードも約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入力できるコードの動作検証
実際に実行してみます。
9×9マスで入力ができるウィンドウが表示されました。ちょっとサイズが小さいが・・・
実際に数字を入力してsolveボタンを押して解を求めてみます
こちらも一瞬で解が表示されました。
ルールを満たしていない場合
ルール上、おかしい数値を入力した場合はどうなるのでしょうか?
残念ながらいくら待ってもエラーも出ず実行が続きました。
検証結果
GUIなしのコードもGUI入力のコードもルールに従った入力であれば問題なく動作しました。
GUIの部分は使い勝手が良いとはいいがたいですが、動作的には問題ありませんでした。
1分ぐらいでエラーが出ず実際に動くコードが生成されるので、ChatGPT有効活用するとかなり作業効率がアップできると感じました。
大枠のコードはChatGPTで生成し、細かい例外処理や使い勝手の部分は人間が微調整することで十分実用的なアプリケーションができると思います。
皆さんもChatGPT使ってみてください。
この記事以外にもpythonの実際に動くコードを公開していますのでそちらの記事も読んでいただけると嬉しいです。
コメント