『魔法陣』4次魔法陣(4×4)をPythonで解く

目次

『魔法陣』4次魔法陣(4×4)の概略

これは、縦、横、斜めの和がすべて34になる、4次魔方陣です。

4次魔方陣の解は、880個あります。コンピュータが発明されるはるか前に手計算ですべて解かれている点は驚きです。
この4次魔方陣には不思議な性質があります。

下の赤色の合計、青色の合計、黄色の合計、緑色の合計はすべて34になります。
これは、880個の4次魔方陣すべてに当てはまります。

4次魔方陣の全解答880通りを算出するプログラム(Pythonコード)

以下は、4次魔方陣の全解答880通りを算出するプログラム(Pythonコード)です。
回転したもの、鏡像(裏返し)のものは同一のものとみなしています。

a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;j=0;k=0;l=0;m=0;n=0;o=0;p=0#要素の初期化
cnt=0#カウンタの初期化

for ai in range(16):#ループ1
	a=ai+1#aの確定(0,0)
	
	for di in range(16):#ループ2
		d=di+1#dの確定(3,0)
		if(d>a):
		
			for mi in range(16):#ループ3
				m=mi+1#mの確定(0,3)
				if (m>d):
					p=34-(a+d+m)#pの確定(3,3)
					if (p<17) and (p>0) and (p>a) and (p!=d) and (p!=m) :
					
						for fi in range(16):#ループ4
							f=fi+1#fの確定(1,1)
							if (f!=a) and (f!=d) and (f!=m) and (f!=p):	
								k=34-(a+f+p)#kの確定(2,2)
								if (k<17) and (k>0) and (k!=a) and (k!=d) and (k!=m) and (k!=p) and (k!=f):
								
									for gi in range(16):#ループ5
										g=gi+1#gの確定(2,1)
										if (g!=a) and (g!=d) and (g!=m) and (g!=p) and (g!=f) and (g!=k):
											j=34-(f+g+k)#jの確定(2,2)
											if (j<17) and (j>0) and (j!=a) and (j!=d) and (j!=m) and (j!=p) and (j!=f) and (j!=k) and (j!=g):
											
												for bi in range(16):#ループ6
													b=bi+1#bの確定(1,0)
													if (b!=a) and (b!=d) and (b!=m) and (b!=p) and (b!=f) and (b!=k) and (b!=g) and (b!=j):	
														c=34-(a+b+d)#cの確定(2,0)
														n=34-(b+f+j)#nの確定(1,3)
														o=34-(c+g+k)#oの確定(2,3)
														if (c<17) and (c>0) and (c!=a) and (c!=d) and (c!=m) and (c!=p) and (c!=f) and (c!=k) and (c!=g) and (c!=j) and (c!=b):
															if (n<17) and (n>0) and (n!=a) and (n!=d) and (n!=m) and (n!=p) and (n!=f) and (n!=k) and (n!=g) and (n!=j) and (n!=b) and (n!=c):
																if (o<17) and (o>0) and (o!=a) and (o!=d) and (o!=m) and (o!=p) and (o!=f) and (o!=k) and (o!=g) and (o!=j) and (o!=b) and (o!=c) and (o!=n):
																
																	for ei in range(16):#ループ7
																		e = ei+1#eの確定(1,0)
																		if (e!=a) and (e!=d) and (e!=m) and(e!=p) and(e!=f) and (e!=k) and (e!=g) and (e!=j) and (e!=b) and (e!=c) and (e!=n) and (e!=o):
																			h=34-(e+f+g)#hの確定(3,1)
																			i=34-(a+e+m)#iの確定(0,2)
																			l=34-(d+h+p)#lの確定(3,2)
																			if (h<17) and (h>0) and (h!=a) and (h!=d) and (h!=m) and (h!=p) and(h!=f) and (h!=k) and (h!=g) and(h!=j) and(h!=b) and (h!=c) and (h!=n) and (h!=o) and (h!=e):
																				if (i<17) and (i>0) and (i!=a) and (i!=d) and (i!=m) and (i!=p) and (i!=f) and (i!=k) and (i!=g) and (i!=j) and (i!=b) and (i!=c) and (i!=n) and (i!=o) and (i!=e) and (i!=h):
																					if (l<17) and (l>0) and (l!=a) and (l!=d) and (l!=m) and (l!=p) and (l!=f) and (l!=k) and (l!=g) and (l!=j) and (l!=b) and (l!=c) and (l!=n) and (l!=o) and (l!=e) and (l!=h) and (l!=i):
																						cnt+=1
																						print(cnt,"a=",a,": b=",b,": c=",c,": d=",d,": e=",e,": f=",f,": g=",g,": h=",h,": i=",i,": j=",j,": k=",k,": l=",l,": m=",m,": n=",n,": o=",o,": p=",p)

出力は以下のようになります。(880個もあるので途中省略しました。)

1 a= 1 : b= 15 : c= 14 : d= 4 : e= 12 : f= 6 : g= 7 : h= 9
: i= 8 : j= 10 : k= 11 : l= 5 : m= 13 : n= 3 : o= 2 : p= 16
2 a= 1 : b= 14 : c= 15 : d= 4 : e= 12 : f= 7 : g= 6 : h= 9
: i= 8 : j= 11 : k= 10 : l= 5 : m= 13 : n= 2 : o= 3 : p= 16
3 a= 1 : b= 15 : c= 14 : d= 4 : e= 8 : f= 10 : g= 11 : h= 5
: i= 12 : j= 6 : k= 7 : l= 9 : m= 13 : n= 3 : o= 2 : p= 16
4 a= 1 : b= 14 : c= 15 : d= 4 : e= 8 : f= 11 : g= 10 : h= 5
: i= 12 : j= 7 : k= 6 : l= 9 : m= 13 : n= 2 : o= 3 : p= 16
5 a= 1 : b= 16 : c= 13 : d= 4 : e= 11 : f= 6 : g= 7 : h= 10
: i= 8 : j= 9 : k= 12 : l= 5 : m= 14 : n= 3 : o= 2 : p= 15
6 a= 1 : b= 13 : c= 16 : d= 4 : e= 12 : f= 8 : g= 5 : h= 9
: i= 7 : j= 11 : k= 10 : l= 6 : m= 14 : n= 2 : o= 3 : p= 15
7 a= 1 : b= 16 : c= 13 : d= 4 : e= 7 : f= 10 : g= 11 : h= 6
: i= 12 : j= 5 : k= 8 : l= 9 : m= 14 : n= 3 : o= 2 : p= 15
(途中省略)
875 a= 7 : b= 6 : c= 12 : d= 9 : e= 1 : f= 14 : g= 4 : h= 15
: i= 16 : j= 11 : k= 5 : l= 2 : m= 10 : n= 3 : o= 13 : p= 8
876 a= 7 : b= 6 : c= 12 : d= 9 : e= 15 : f= 14 : g= 4 : h= 1
: i= 2 : j= 11 : k= 5 : l= 16 : m= 10 : n= 3 : o= 13 : p= 8
877 a= 7 : b= 2 : c= 16 : d= 9 : e= 6 : f= 15 : g= 1 : h= 12
: i= 11 : j= 14 : k= 4 : l= 5 : m= 10 : n= 3 : o= 13 : p= 8
878 a= 7 : b= 2 : c= 16 : d= 9 : e= 12 : f= 15 : g= 1 : h= 6
: i= 5 : j= 14 : k= 4 : l= 11 : m= 10 : n= 3 : o= 13 : p= 8
879 a= 7 : b= 4 : c= 14 : d= 9 : e= 5 : f= 16 : g= 2 : h= 11
: i= 12 : j= 13 : k= 3 : l= 6 : m= 10 : n= 1 : o= 15 : p= 8
880 a= 7 : b= 4 : c= 14 : d= 9 : e= 11 : f= 16 : g= 2 : h= 5
: i= 6 : j= 13 : k= 3 : l= 12 : m= 10 : n= 1 : o= 15 : p= 8

目次