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サポーターズ
- 発売日: 2014/10/31
- メディア: Kindle版