前回の続きで、具体的なプログラミングを行ってみます。
まず、Google Gemini を使って9要素のリストが1~9のすべての数字を含んでいるかどうかを調べる関数check_list()を作ります。
Gemini へのプロンプトは、以下の通りです。
「要素数9のリスト b を引数として、
リストの各要素が重複しないで1から9の値になっているかどうかを調べて、この条件を満たすときは真、満たさない場合は偽を返すような関数 check_list(b)を作成してください。」
Gemini の回答: (抜粋)
## リストの要素が重複なく1から9まで含まれているか判定する関数
def check_list(b):
"""
リストbの要素が重複なく1から9まで含まれているかを判定する関数
Args:
b: 判定対象のリスト
Returns:
bool: 条件を満たす場合はTrue、満たさない場合はFalse
"""
# 要素数が9でない場合、Falseを返す
if len(b) != 9:
return False
# 要素が1から9の範囲に含まれていないか、重複があるかを確認
return set(b) == set(range(1, 10))
### コード解説
1. **関数定義:**
* `check_list(b)`: リスト `b` を引数にとる関数。
2. **要素数チェック:**
* `if len(b) != 9:`: リストの長さが9でない場合、条件を満たさないためFalseを返す。
3. **重複と範囲チェック:**
* `return set(b) == set(range(1, 10))`:
* `set(b)`: リスト `b` を集合に変換することで、重複を自動的に除去する。
* `set(range(1, 10))`: 1から9までの数値の集合を作成する。
* `==`: 両方の集合が等しいか(要素が完全に一致するか)を比較する。
* 集合が等しい場合、リスト `b` の要素が重複なく1から9まで含まれていることを意味するため、Trueを返す。
### 動作原理
* **集合の利用:** 集合は重複した要素を持たないため、リストを集合に変換することで、要素の重複を簡単に検出できる。
* **範囲の比較:** `range(1, 10)` で生成した集合と、リスト `b` から作成した集合を比較することで、要素が1から9までの範囲に含まれているか、かつ重複がないかを同時に確認できる。
=====ここまで
docstring 付きですね。数字が順番に並んでいないので、set()を使ってリストを集合に替えて判定するのですね。
解説も分かりやすく、そのまま利用できます。
次に、「数独」の9個のブロックが1から9の数値を重複無く含んでいるかを調べるために、
3行毎に3回に分けて調べるようにします。一つでも False になると直ぐに終了して次に行くのと、長くなりそうなのでこうしてみました。
そのために、3つの行を引数にして条件を調べる chk_block(a,b,c) という関数を作ってみます。
これは、生成AIを使わないで、単純に次のようにしました。
(Gemini は、docstring作成にのみ使いました。Raises:とExamples:は省略)
def chk_block(a,b,c):
"""
3つのリストを9要素ずつに分割し、各ブロックに対して `check_list` 関数を適用します。
全てのブロックで `check_list` が `True` を返す場合にのみ、`True` を返します。
Args:
a (list): 要素数9のリスト
b (list): 要素数9のリスト
c (list): 要素数9のリスト
Returns:
bool: 全てのブロックが `check_list` の条件を満たす場合にTrue、そうでない場合にFalse
"""
block1 = a[0:3] + b[0:3] + c[0:3]
block2 = a[3:6] + b[3:6] + c[3:6]
block3 = a[6:] + b[6:] + c[6:]
if check_list(block1) == False:
return False
if check_list(block2) == False:
return False
if check_list(block3) == False:
return False
return True
この2つの関数をテストします。
ファイル prog-01.py で、2つの関数を定義して、その下に以下のテストプログラムを挿入して実行します。
row1 = [1, 2, 3, 4, 5, 6, 7, 8, 9 ]
row2 = [4, 5, 6, 7, 8, 9, 1, 2, 3 ]
row3 = [7, 8, 9, 1, 2, 3, 4, 5, 6 ]
if chk_block(row1, row2, row3):
print("OK")
else:
print("NG")
row1 = [1, 2, 3, 4, 5, 6, 7, 8, 9 ]
row2 = [4, 5, 6, 7, 8, 9, 1, 7, 3 ]
row3 = [7, 8, 9, 1, 2, 3, 4, 5, 6 ]
if chk_block(row1, row2, row3):
print("OK")
else:
print("NG")
row1 = [1, 2, 3, 4, 5, 6, 7, 8, 9 ]
row2 = [4, 5, 6, 7, 2, 9, 1, 2, 3 ]
row3 = [7, 8, 9, 1, 2, 3, 4, 5, 6 ]
if chk_block(row1, row2, row3):
print("OK")
else:
print("NG")
row1 = [1, 2, 3, 4, 5, 6, 7, 8, 9 ]
row2 = [4, 5, 6, 7, 8, 9, 1, 2, 3 ]
row3 = [7, 8, 1, 1, 2, 3, 4, 5, 6 ]
if chk_block(row1, row2, row3):
print("OK")
else:
print("NG")
$ python3 prog01.py
OK
NG
NG
NG
$
テストで問題ないことが分かりました。
長くなりましたので、続きはまた後で投稿します。
まず、Google Gemini を使って9要素のリストが1~9のすべての数字を含んでいるかどうかを調べる関数check_list()を作ります。
Gemini へのプロンプトは、以下の通りです。
「要素数9のリスト b を引数として、
リストの各要素が重複しないで1から9の値になっているかどうかを調べて、この条件を満たすときは真、満たさない場合は偽を返すような関数 check_list(b)を作成してください。」
Gemini の回答: (抜粋)
## リストの要素が重複なく1から9まで含まれているか判定する関数
def check_list(b):
"""
リストbの要素が重複なく1から9まで含まれているかを判定する関数
Args:
b: 判定対象のリスト
Returns:
bool: 条件を満たす場合はTrue、満たさない場合はFalse
"""
# 要素数が9でない場合、Falseを返す
if len(b) != 9:
return False
# 要素が1から9の範囲に含まれていないか、重複があるかを確認
return set(b) == set(range(1, 10))
### コード解説
1. **関数定義:**
* `check_list(b)`: リスト `b` を引数にとる関数。
2. **要素数チェック:**
* `if len(b) != 9:`: リストの長さが9でない場合、条件を満たさないためFalseを返す。
3. **重複と範囲チェック:**
* `return set(b) == set(range(1, 10))`:
* `set(b)`: リスト `b` を集合に変換することで、重複を自動的に除去する。
* `set(range(1, 10))`: 1から9までの数値の集合を作成する。
* `==`: 両方の集合が等しいか(要素が完全に一致するか)を比較する。
* 集合が等しい場合、リスト `b` の要素が重複なく1から9まで含まれていることを意味するため、Trueを返す。
### 動作原理
* **集合の利用:** 集合は重複した要素を持たないため、リストを集合に変換することで、要素の重複を簡単に検出できる。
* **範囲の比較:** `range(1, 10)` で生成した集合と、リスト `b` から作成した集合を比較することで、要素が1から9までの範囲に含まれているか、かつ重複がないかを同時に確認できる。
=====ここまで
docstring 付きですね。数字が順番に並んでいないので、set()を使ってリストを集合に替えて判定するのですね。
解説も分かりやすく、そのまま利用できます。
次に、「数独」の9個のブロックが1から9の数値を重複無く含んでいるかを調べるために、
3行毎に3回に分けて調べるようにします。一つでも False になると直ぐに終了して次に行くのと、長くなりそうなのでこうしてみました。
そのために、3つの行を引数にして条件を調べる chk_block(a,b,c) という関数を作ってみます。
これは、生成AIを使わないで、単純に次のようにしました。
(Gemini は、docstring作成にのみ使いました。Raises:とExamples:は省略)
def chk_block(a,b,c):
"""
3つのリストを9要素ずつに分割し、各ブロックに対して `check_list` 関数を適用します。
全てのブロックで `check_list` が `True` を返す場合にのみ、`True` を返します。
Args:
a (list): 要素数9のリスト
b (list): 要素数9のリスト
c (list): 要素数9のリスト
Returns:
bool: 全てのブロックが `check_list` の条件を満たす場合にTrue、そうでない場合にFalse
"""
block1 = a[0:3] + b[0:3] + c[0:3]
block2 = a[3:6] + b[3:6] + c[3:6]
block3 = a[6:] + b[6:] + c[6:]
if check_list(block1) == False:
return False
if check_list(block2) == False:
return False
if check_list(block3) == False:
return False
return True
この2つの関数をテストします。
ファイル prog-01.py で、2つの関数を定義して、その下に以下のテストプログラムを挿入して実行します。
row1 = [1, 2, 3, 4, 5, 6, 7, 8, 9 ]
row2 = [4, 5, 6, 7, 8, 9, 1, 2, 3 ]
row3 = [7, 8, 9, 1, 2, 3, 4, 5, 6 ]
if chk_block(row1, row2, row3):
print("OK")
else:
print("NG")
row1 = [1, 2, 3, 4, 5, 6, 7, 8, 9 ]
row2 = [4, 5, 6, 7, 8, 9, 1, 7, 3 ]
row3 = [7, 8, 9, 1, 2, 3, 4, 5, 6 ]
if chk_block(row1, row2, row3):
print("OK")
else:
print("NG")
row1 = [1, 2, 3, 4, 5, 6, 7, 8, 9 ]
row2 = [4, 5, 6, 7, 2, 9, 1, 2, 3 ]
row3 = [7, 8, 9, 1, 2, 3, 4, 5, 6 ]
if chk_block(row1, row2, row3):
print("OK")
else:
print("NG")
row1 = [1, 2, 3, 4, 5, 6, 7, 8, 9 ]
row2 = [4, 5, 6, 7, 8, 9, 1, 2, 3 ]
row3 = [7, 8, 1, 1, 2, 3, 4, 5, 6 ]
if chk_block(row1, row2, row3):
print("OK")
else:
print("NG")
$ python3 prog01.py
OK
NG
NG
NG
$
テストで問題ないことが分かりました。
長くなりましたので、続きはまた後で投稿します。
※コメント投稿者のブログIDはブログ作成者のみに通知されます