答えを見ずに,解いてみますか.例題は…
? ? ? ? ? ? ? ? ? ?
と,Emacsのscratchバッファに書き込んでから,?を数字に置き換えていきます.まず,2つの和が10になるということなので
? 5 5 ? ? ? ? ? ? ?
とします.その後は数字を書いたり,?に戻したりして,答えにたどり着きました.
練習問題のほうは,中央の値が5の場合,4の場合,…と試して,答えが出ました.
別解があったりしないか,気になったので,Rubyスクリプト(TrianglePuzzleSolver.rb)を書きました.Gistに置いておきます.solverと銘打つのは,JAMAICA solver以来,solverと銘打っていないソルバーは,和が全て異なる魔方陣以来です.
アルゴリズムはというと,
H G I F E J A B C D
と,数字を置く箇所にA〜Jの名前を割り振りまして,まずA〜Eについては{1,2,3,4,5}の順列です.次にF〜Hは,{1,2,3,4,5}からAの値とEの値を除いた,3つの数の集合について,順列を求めて割り振ります.IとJは,{1,2,3,4,5}からDとEとHの値を除いた,2つの数の順列です.
これで場合の数は5!・3!・2!=1440通りとなりますが,このままでは,
4 3 1 2 5 2 1 2 3 4
を許してしまいます.10個の値が適切かどうか,具体的には
条件1:すべての○には1から5の整数がはいる。
私の開発した「三角パズル」を紹介します。 | ハフポスト
条件2:各辺の4個の○と中心の1個の○、合計5個の○がすべて異なる(略)
を満たすかどうか判定するメソッドを定義し,値の割り振り後に通すようにしました.
ruby TrianglePuzzleSolver.rbを実行したら,冒頭のリンク先の例題と練習問題についてその解を出力します.
ruby -d TrianglePuzzleSolver.rbと実行すると,条件1と条件2を満たすすべてのパターンや,条件3に関する6つの数字(和)をもとにしたパターンも,出力します.条件1と条件2を満たすのは960通りです.ABCDEは5!=120通りなのにFGHIJは960÷120=8通りの自由度しかないのは興味深いところです.さらに,別解がないことも分かりました.言い換えると,条件3として指定される6つの数字に対して,解(条件1〜3をすべて満たすもの)が存在するならば,それが唯一ということです.
検証用の出力をTrianglePuzzleSolver.txt に置いておきます.全パターンの数は,「Table」を(後ろから)検索することにより,また別解がないのは,「case 2」が出現しないことにより,それぞれ確認できます.
「三角パズル」の作者,[twitter:@seongchong]さんにIDコールし,敬意を表します.