Day 111簡単な数独チェックプログラム
Pythonコード
1def check_sudoku(board):2 # 行ごとのチェック3 for row in board:4 if sorted(row) != list(range(1, 10)):5 return False6 7 # 列ごとのチェック8 for col in range(9):9 column = [row[col] for row in board]10 if sorted(column) != list(range(1, 10)):11 return False12 13 # 3x3サブグリッドごとのチェック14 for i in range(0, 9, 3):15 for j in range(0, 9, 3):16 subgrid = [board[x][y] for x in range(i, i+3) for y in range(j, j+3)]17 if sorted(subgrid) != list(range(1, 10)):18 return False19 20 return True21 22# サンプル数独ボード23board = [24 [5, 3, 4, 6, 7, 8, 9, 1, 2],25 [6, 7, 2, 1, 9, 5, 3, 4, 8],26 [1, 9, 8, 3, 4, 2, 5, 6, 7],27 [8, 5, 9, 7, 6, 1, 4, 2, 3],28 [4, 2, 6, 8, 5, 3, 7, 9, 1],29 [7, 1, 3, 9, 2, 4, 8, 5, 6],30 [9, 6, 1, 5, 3, 7, 2, 8, 4],31 [2, 8, 7, 4, 1, 9, 6, 3, 5],32 [3, 4, 5, 2, 8, 6, 1, 7, 9]33]34 35print(check_sudoku(board))
解説
- 行1〜3: このプログラムでは、数独のボードをチェックする関数 `check_sudoku` を定義しています。ボードは 2 次元のリストで表されます。関数は、ボードが正しい数独のルールに従っているかどうかをチェックします。
- 行5〜7: まず、各行について、数字が 1 から 9 までの範囲で、かつ重複がないかどうかをチェックします。`sorted` 関数はリストの要素を昇順に並べ替えます。`list(range(1, 10))` は 1 から 9 までの数字のリストを作ります。
- 行9〜11: 次に、各列についても同じチェックを実行します。列の要素を取得するために、リスト内包表記を使用しています。
- 行13〜16: さらに、3x3 のサブグリッドについてもチェックします。2 つのループを使用して、サブグリッドの位置を指定し、リスト内包表記でサブグリッドの要素を取得します。
- 行18〜27: サンプル数独ボードを定義し、`check_sudoku` 関数に渡して結果を出力します。
- 行4〜17: 補足: `sorted()` は並べ替えた新しいリストを返す関数です。つまり、リスト内の要素を小さい順に並べ替えます。
- 行35: 補足: `print()` は画面に文字や値を表示する関数です。
次に試してみよう
- 数独のボードを自分で作成し、チェック関数に渡してみましょう。
- チェック関数を拡張して、不正なボードの場合に具体的なエラーメッセージを出力するようにしてみましょう。
- 数独のボードを入力として受け取り、チェック関数を実行するプログラムを作成してみましょう。