SimplePrograms を利用して、Pythonの入門も大体終了したので、実際にプログラミングしてみます。
プログラムしようと思ったのは「数独」です。
スマートフォンを使っていると、この問題は解けるか?という宣伝広告が出てくることがあります。いくつか候補を試して進めるしかないような場合があって鬱陶しいので、それをプログラムで解いてしまおうとする試みです。本当に解が1つしかないのかなども試してみたいです。
今回は、問題を与えて解を求めるように作ってみます。最近、生成AIによるプログラミングも話題になっているので使ってみたいと思います。と言っても、全部作ってもらうと入門にならないので、手順はあらかじめ考えておいて、それを実現するような関数を生成AIに作ってもらい実現してみようと思いました。
考えた手順はこんな感じです。
初期化)
1)マスを横方向にみて、9個の要素を含むリストとみなし、上からR1、R2、...、R9 とします。
各リストには1~9の数字が重複しないで入っている必要があります。
2)空白は0、初期の数字はそのまま(1から9の整数)R1~R9の各要素に代入して初期値にします。
数値挿入)
3)このリストrの0の要素に、残りの数値を入れたリスト(複数できる)をすべて生成するような
関数 fill_list(r)
を作ります。その返却値は、一つの要素が、要素数9個のリストである、リストです。
条件判定)
4)引数で与えたリストの要素が1)の条件を満たすリストかどうかを判定する
関数 check_list(list)
を作ります。
各行は条件をすでに条件をみたしているので、ブロックと列の判定にこれを使います。
答えを探す)
5)話を単純にするために、9重のforループを作り、条件を満たすかどうかを check_list() で判定します。こんな感じでしょうか。
for row1 in fill_list(R1):
for row2 in fill_list(R2):
for row3 in fill_list(R3):
for row4 in fill_list(R4):
for row5 in fill_list(R5):
for row6 in fill_list(R6):
for row7 in fill_list(R7):
for row8 in fill_list(R8):
for row9 in fill_list(R9):
チェックする量が膨大ですが、そのほとんどが条件を満たさないので、満たさなかったらcontinue文を使って直ぐ次に行くようにしたほうが良さそうです。答えが2つ以上ある場合もありそうですから。
列の判定)
6)列の判定は、row1 ~ row9 の各要素を先頭から取り出してマスの縦方向のカラムを表す
9個のリストに対してcheck_list()で判定して、
どれかが偽なら次のループへ、
すべてが真なら列は条件を満たしていることになります。
ブロックの判定)
7)ブロックの判定は、数独の9つのブロックをリストにして、そのリストに対してcheck_list()を実施して、
どれかが偽なら次のループへ、
すべてが真ならブロックの条件を満たしてることになります。
ループの一番内側で使うより、3つの行毎に判定するのが良さそうです。最初の3ブロックで条件を満たさなければ残りの6行を用意して判定する必要はありませんから。
6)、7)の順番は自由です。
こんな感じです。
生成AIは、各関数を作成するのに利用してみます。
上の手順の中で、check_list() と fill_list()の関数を作成してもらいたいと思います。
長くなるので、今後分割して投稿したいと思います。
プログラムしようと思ったのは「数独」です。
スマートフォンを使っていると、この問題は解けるか?という宣伝広告が出てくることがあります。いくつか候補を試して進めるしかないような場合があって鬱陶しいので、それをプログラムで解いてしまおうとする試みです。本当に解が1つしかないのかなども試してみたいです。
今回は、問題を与えて解を求めるように作ってみます。最近、生成AIによるプログラミングも話題になっているので使ってみたいと思います。と言っても、全部作ってもらうと入門にならないので、手順はあらかじめ考えておいて、それを実現するような関数を生成AIに作ってもらい実現してみようと思いました。
考えた手順はこんな感じです。
初期化)
1)マスを横方向にみて、9個の要素を含むリストとみなし、上からR1、R2、...、R9 とします。
各リストには1~9の数字が重複しないで入っている必要があります。
2)空白は0、初期の数字はそのまま(1から9の整数)R1~R9の各要素に代入して初期値にします。
数値挿入)
3)このリストrの0の要素に、残りの数値を入れたリスト(複数できる)をすべて生成するような
関数 fill_list(r)
を作ります。その返却値は、一つの要素が、要素数9個のリストである、リストです。
条件判定)
4)引数で与えたリストの要素が1)の条件を満たすリストかどうかを判定する
関数 check_list(list)
を作ります。
各行は条件をすでに条件をみたしているので、ブロックと列の判定にこれを使います。
答えを探す)
5)話を単純にするために、9重のforループを作り、条件を満たすかどうかを check_list() で判定します。こんな感じでしょうか。
for row1 in fill_list(R1):
for row2 in fill_list(R2):
for row3 in fill_list(R3):
for row4 in fill_list(R4):
for row5 in fill_list(R5):
for row6 in fill_list(R6):
for row7 in fill_list(R7):
for row8 in fill_list(R8):
for row9 in fill_list(R9):
チェックする量が膨大ですが、そのほとんどが条件を満たさないので、満たさなかったらcontinue文を使って直ぐ次に行くようにしたほうが良さそうです。答えが2つ以上ある場合もありそうですから。
列の判定)
6)列の判定は、row1 ~ row9 の各要素を先頭から取り出してマスの縦方向のカラムを表す
9個のリストに対してcheck_list()で判定して、
どれかが偽なら次のループへ、
すべてが真なら列は条件を満たしていることになります。
ブロックの判定)
7)ブロックの判定は、数独の9つのブロックをリストにして、そのリストに対してcheck_list()を実施して、
どれかが偽なら次のループへ、
すべてが真ならブロックの条件を満たしてることになります。
ループの一番内側で使うより、3つの行毎に判定するのが良さそうです。最初の3ブロックで条件を満たさなければ残りの6行を用意して判定する必要はありませんから。
6)、7)の順番は自由です。
こんな感じです。
生成AIは、各関数を作成するのに利用してみます。
上の手順の中で、check_list() と fill_list()の関数を作成してもらいたいと思います。
長くなるので、今後分割して投稿したいと思います。
※コメント投稿者のブログIDはブログ作成者のみに通知されます