digit = int('5') - 1 = 4
bit_mask = 1 << 4 = 16
if (rows[0] & 16) != 0: # 既に5が存在するか?
rows[0] |= 16 # 5のビットを立てる
ビット演算による高速化
整数配列による削減
連続メモリアクセス
単純な条件分岐
# 最適化版: 単一配列で27個の制約を管理
masks: List[int] = [0] * 27 # [0-8]: rows, [9-17]: cols, [18-26]: boxes
for i in range(9):
for j in range(9):
if board[i][j] == '.':
continue
# インライン処理で関数呼び出しオーバーヘッドを削減
bit: int = 1 << (int(board[i][j]) - 1) # O(1)ビットマスク作成
box_idx: int = 18 + (i // 3) * 3 + (j // 3) # O(1)ボックス計算
# 3つの制約を1つの条件文で同時チェック
if masks[i] & bit or masks[9 + j] & bit or masks[box_idx] & bit:
return False # O(1)重複検出
# 3つのビットマスクを同時更新
masks[i] |= bit # 行のビットマスク更新
masks[9 + j] |= bit # 列のビットマスク更新
masks[box_idx] |= bit # ボックスのビットマスク更新