萌えハッカーニュースリーダー

2025/09/17 05:22 Solving a Wooden Puzzle Using Haskell

出典: https://glocq.github.io/en/blog/20250428/
hakase
博士

ロボ子、今日は面白いパズルの話をするのじゃ。25個の木製ピースを5x5x5の立方体の箱にぴったり詰めるパズルがあるらしいぞ。

roboko
ロボ子

それは面白そうですね、博士。ピースはどのような形をしているんですか?

hakase
博士

ピースは4x1x1の幹と、片側から突き出た1x1x1の立方体のノッチで構成されているらしいのじゃ。

roboko
ロボ子

なるほど。それを隙間なく箱に詰めるのは難しそうですね。

hakase
博士

そうじゃろう?そこで、この問題を解くために、空間をボクセルのグリッドとしてモデル化するらしいのじゃ。そして、ピースの配置を回転と平行移動で記述するのじゃ。

roboko
ロボ子

ボクセルですか。3D版のピクセルみたいなものですね。回転と平行移動で配置を表すというのは、どのようにするんですか?

hakase
博士

`Disposition`データ型を使って、回転は3x3の行列、平行移動は3成分のベクトルで表現するらしいぞ。ちょっと難しそうじゃな。

roboko
ロボ子

3x3の行列で回転を表すのは、線形代数の知識が必要ですね。平行移動はベクトルで表現できるのは分かりやすいです。

hakase
博士

そして、有効な配置を列挙するために、候補の配置リストを作成して、無効なものをフィルタリングするのじゃ。

roboko
ロボ子

候補を列挙してフィルタリングですか。効率的なアルゴリズムが必要になりそうですね。

hakase
博士

回転行列の候補は、各成分が-1, 0, 1のいずれかである行列として列挙するらしいぞ。平行移動の候補は、ピースが5x5x5の箱に収まるように制限するのじゃ。

roboko
ロボ子

箱に収まるように制限するのは重要ですね。無駄な計算を減らせます。

hakase
博士

無効な配置をフィルタリングするために、回転行列が有効かどうかを、行列が直交群と特殊線形群の両方に属するかどうかで判定するらしいぞ。

roboko
ロボ子

直交群と特殊線形群ですか。数学的な知識が必要ですね。ピースが箱に収まるかどうかは、各キューブの座標が箱の範囲内にあるかどうかで判定するんですね。

hakase
博士

そうじゃ。最終的な出力は、有効な配置をキューブの座標リストに変換するのじゃ。

roboko
ロボ子

このパズル、解くのは大変そうですが、アルゴリズムを考えるのは面白そうですね。

hakase
博士

じゃろ?ところでロボ子、このパズルを解くプログラムを書いたら、ロボットの運動会で使えるかも知れないぞ!

roboko
ロボ子

運動会で使うんですか?

hakase
博士

ロボットが箱にピースを詰める速さを競うのじゃ!…って、そんな競技ないか。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search