数的推理の魔方陣の問題をPythonで解いてみた。

 Google アナリティクスでJavaの魔方陣の記事が上位の方に来ていたので、これをPythonに翻訳してみました。
 変数a,cは順列を生成して変化させて、残りの変数b,d〜kは縦横斜めと四隅の和が34になることから、その残差で求めました。
 やっぱり、Pythonは楽だね。o(^-^)o

● MagicSquare4x4.py

# coding: UTF-8
# MagicSquare4x4.py
#   a  9  5 *b
#  15  c 10 *d
#  *e *f *g *h
#   1 *i *j *k
# 自由な変数は、2個
# 星[*]付きは、残差で求める

from time import time
import itertools

def main():
    tm = time()  # Timer Start
    count = 0
    P = [2,3,4,6,7,8,11,12,13,14,16]
    for p in itertools.permutations(P,2):
        a,c = p
        b = 34-sum([ a, 9, 5, 0])   # 1行目の和
        d = 34-sum([15, c,10, 0])   # 2行目の和
        e = 34-sum([ a,15, 0, 1])   # 1列目の和
        f = 34-sum([ b,10, 0, 1])   # 斜め(/)の和
        i = 34-sum([ 9, c, f, 0])   # 2列目の和
        k = 34-sum([ a, b, 1, 0])   # 四隅の和
        h = 34-sum([ b, d, 0, k])   # 4列目の和
        g = 34-sum([ e, f, 0, h])   # 3行目の和
        j = 34-sum([ 1, i, 0, k])   # 4行目の和
        # Pがちゃんと揃っているか調べる
        if sorted([a,b,c,d,e,f,g,h,i,j,k])!=P: continue
        # チェックを潜り抜けたものだけを表示
        count+=1
        print("[%d]"%count)
        print("%3d%3d%3d%3d"%( a, 9, 5, b))
        print("%3d%3d%3d%3d"%(15, c,10, d))
        print("%3d%3d%3d%3d"%( e, f, g, h))
        print("%3d%3d%3d%3d"%( 1, i, j, k))

    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

[1]
  4  9  5 16
 15  6 10  3
 14  7 11  2
  1 12  8 13
Runtime : 0.000 [sec]

※参考URL
魔方陣パズル - rscの日記
魔方陣パズル(2) - C言語 - rscの日記
4次の魔方陣プログラム - C言語 - rscの日記
数的推理の魔方陣の問題をJavaで解いてみた。 - rscの日記

パーフェクトPython

パーフェクトPython