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 で表す式。それが、そのままは、当てはまらなかったのだけれど、上述のようにすれば、同等の式が得られた。