先週のパズルは「魔方陣」


先週の話ですが、『今週のパズルは「魔方陣」』だったそうです。

魔方陣の問題

計算量に気を遣ってやりたいなら、プログラマの道具箱(深さ優先探索と幅優先探索)で紹介したような探索手法を使えばいいのですが、これは3×3の小さい問題なので、「すべての組み合わせから条件に合うものを選択する」という戦略でもすぐに終わります(UMMでも動きます)。

まずは、条件に合うかどうかを調べる述語。

validQ[x_] := With[{s = Total[x[[1 ;; 3]]]},
  And[
   s == Total[x[[4 ;; 6]]],
   s == Total[x[[7 ;; 9]]],
   s == Total[x[[1 ;; 7 ;; 3]]],
   s == Total[x[[2 ;; 8 ;; 3]]],
   s == Total[x[[3 ;; 9 ;; 3]]],
   s == Total[{x[[1]], x[[5]], x[[9]]}], 
   s == Total[{x[[3]], x[[5]], x[[7]]}]]]

あとは、利用できる数字のテーブルを作って(Table)、そのすべての組み合わせ(Permutations)から、条件に合うもの(validQ)を、選択します(Select)。

solutions = Select[Permutations@Table[2 i, {i, 0, 8}], validQ]

見やすく表示させるとこんな感じです。

TableForm@Partition[solutions[[1]], 3]

2  12 10
16 8  0
6  4  14

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です