わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

和が全て異なる魔方陣

いきなりですが問題です.

縦・横・斜めの3つのマス内の数字の和が全て異なるように,0〜8を各1個ずつ入れます.灰色の4つのマスには奇数の数字を入れます.いま,0,3,6が図のように入っています.このとき,残りの1,2,4,5,7,8を入れなさい.

答えの前に元ネタです.

「上の問題,“優れた子ども”は,どんな方法で解くの?」に対する,この文献での答えは,次のとおりです.

一般の子どもの問題解決過程は,上でみたように,3 つの奇数の位置を固定して偶数の位置に入る数を一つずつずらして,すべての和を求めて解答の妥当性を判断するものだった.一方,優れた子どもの問題解決過程は,4つの奇数の位置を抜き出し,限られた部分のみを用いて解答の可能性を絞るものだった.一般の子どもが9つの数を扱っているのに対して,優れた子どもは限られた4つの数のみを用いて問題解決を図っていた.つまり,優れた子どもは複雑な場面において,各要素間の関係を考慮に入れ,より単純化された問題を導き出し,それを解決することにより問題全体を解決している.一般の子どもも奇数を固定することにより問題を単純化してはいるものの優れた子どもが導いた問題はさらに単純化されたものであった.
(p.53)

といったところで解答ですが…当該文献の図3(p.50)をご覧ください.
問題文と初期配置を見まして,灰色で数の埋まっていない3箇所に1,5,7を,白色で数の埋まっていない箇所に2,4,8を,それぞれ割り当てるのだから,3!×3!=6×6=36通りしかないのか,じゃあプログラムを書いて解けそうだなと思い,Rubyスクリプトにしました.いつものようにソースはGistに置いておきます.
このプログラムは引数をとります.デフォルトは,色を無視して,6箇所に1,2,4,5,7,8を入れ,各パターンについて題意を満たすかを判定します.パターンは6!=720通りです.コマンドライン引数に2を書いて実行すると,奇数と偶数に分けて当てはめますので,パターンは36通りに減ります.コマンドライン引数を3にすると,何も置いていない状態から,0〜8を各1個ずつ入れ(パターンは9!=362880通り),それぞれ判定します.
題意を満たさないときは,その理由も出力します.コードに入れたのは,数字が入っていない箇所がある(not filled),同一の数字が入っている(same numbers found),0・3・6の位置が条件と異なる(initial state changed),「灰色の4つのマスには奇数の数字」に反する(odd number condition violated),「和が全て異なる」に反する(same sums found)の5つです.3種類のいずれの解き方でも,解は一つしかないことを確認しました*1
Rubyプログラミングとして考慮したのは次の2つです.まず3×3のテーブルのデータ表現ですが,2次元ではなく1次元の配列を用いました.中央のマスの値は@numbers[4]となります.それと「同一の数字」「和が全て異なる」の判定に関しては,Array#uniqを使用しました.例えば「値が全て異なる」というのは,値を配列aに入れて,a.uniq.length == a.lengthにより判定できます.
「和が全て異なる魔方陣」には何か名称がないものかと,wikipedia:魔方陣に当たったところ,「和がすべて異なるものをヘテロ陣、その和がすべて連続数になっているものをアンチ陣と呼ぶことがある」と書かれていました.それと,6×6=36通りを試すのは,文献のp.45にある図の中で「B13 36通りすべての場合」のことでした.


表生成のコマンドを書いておきます.Cygwinで実行しました.

  • フォント設定

FONT=/cygdrive/c/Windows/Fonts/meiryo.ttc

  • 初期配置

convert -size 184x184 xc:white -fill gray75 -stroke none -draw "rectangle 62,2 122,62 rectangle 2,62 62,122 rectangle 122,62 182,122 rectangle 62,122 122,182" -fill black -pointsize 36 -font $FONT -draw 'text 141,46 "6" text 21,106 "3" text 21,166 "0"' -fill none -stroke blue -strokewidth 2 -draw "rectangle 2,2 182,182 rectangle 62,2 122,182 rectangle 2,62 182,122" -quality 95 masq3x3.png

  • 正解の配置*2

convert -size 184x184 xc:white -fill gray75 -stroke none -draw "rectangle 62,2 122,62 rectangle 2,62 62,122 rectangle 122,62 182,122 rectangle 62,122 122,182" -fill black -pointsize 36 -font $FONT -draw 'text 21,46 "8" text 81,46 "7" text 141,46 "6" text 21,106 "3" text 81,106 "4" text 141,106 "1" text 21,166 "0" text 81,166 "5" text 141,166 "2"' -fill none -stroke blue -strokewidth 2 -draw "rectangle 2,2 182,182 rectangle 62,2 122,182 rectangle 2,62 182,122" -quality 95 masq3x3answer.png

(最終更新:2014-07-08 朝)

*1:引数なし(720通り)についてはTrial #710,引数が2(36通り)ではTrial #30,引数が3(362880通り)ではTrial #362600で,それぞれその値に限り,「Result: OK」と出ます.出力を全て見なくても,「| grep OK」をつけてコマンドを実行すれば,確かめられます.

*2: