Magic Square
やったー。久々の単独首位@C。みなさんの解答を見てみると、やり方が違っている。ストラテジー勝ちといったところか。アルゴリズム勝ちとも言えるか。
簡単に解説を。。。
魔方陣を以下のように分解する。
|23 12 1 20 9| |4 2 0 3 1| |2 1 0 4 3| | 4 18 7 21 15| |0 3 1 4 2| |3 2 1 0 4| |10 24 13 2 16| = |1 4 2 0 3| * 5 + |4 3 2 1 0| + 1 |11 5 19 8 22| |2 0 3 1 4| |0 4 3 2 1| |17 6 25 14 3| |3 1 4 2 0| |1 0 4 3 2|
つまり、1 ベースから 0 ベースにし、各項を a*n+b ( n は魔方陣のサイズ)に分解してやる。こうすると、確かにもともときれいな構造をしているが、さらにきれいな構造が浮かび上がる。この右辺のそれぞれの行列を x,y を使って表すと、
(y+2*n-2*x-1)%n*n + (y+n+n/2-x)%n + 1
となり、これを y,x に関する 2 重の for 文にすれば、答えが得られる。後は、小手先の調整で、1 重 for 文に変更し、index の仕方をちょっと工夫すれば、私の解(98B) が得られるということ。本問題は、この方針が適していたようだ。
なお、元ネタは、Wikipedia で、Wikipedia:Magic square のちょうど真ん中あたりに出ている、奇数次元の魔方陣の各項を index i,j で表す式。それが、そのままは、当てはまらなかったのだけれど、上述のようにすれば、同等の式が得られた。