4x4の魔法陣を独自の解法で解く挑戦
今度はこんなアプローチをしてみる。
1から16までの数のうち、4つの数字の和が34となるものを4つ作る
それぞれを全パターン入れ替えして魔法陣の出来上がったものを残していく。
実行ファイルのフォルダにmemo.txtも必要
linuxようなので他の環境だと改行、pathの指定で動かないかも

1時間ほどで終了

7040個ある
この1行を8文字ずつで改行すると4x4の魔法陣になります(人力では1度も確認してませんが)
ということで6x6に挑戦

残念ながらまったく動きません。
それならばと5x5も作ってみました。
残念ながらまったく動きません。
4x4だと列の入れ替えが(4x3x2)の4乗 331776回なのですが
6x6だと列の入れ替えが720の6乗 139314069504000000回
5x5でも列の入れ替えが120の5乗 24883200000回
4x4だとこの入れ替えを9500回近く回すと全パターン作成できます。
5x5だと1時間で1パターン回せるかどうか
6x6だと0が7つ違うので100年で1パターンぐらいでしょうか?
その1パターンで魔法陣が見つかるとはかぎりません。
今度はこんなアプローチをしてみる。
1から16までの数のうち、4つの数字の和が34となるものを4つ作る
それぞれを全パターン入れ替えして魔法陣の出来上がったものを残していく。
import itertools import time def readtext(): global ans f = open('./memo.txt') ans = f.readlines() f.close() def appendtext(s): f = open('./memo.txt','a') f.write(s+'\n') f.close() ans=[] readtext() a16=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] def makeline(arr): return "".join([("0"+str(i))[-2:] for i in arr]) def printLine(s): print(s[0:4]) print(s[4:8]) print(s[8:12]) print(s[12:16]) print("") def delete_arr(arr,delArr): r=[] for i in arr: if i in delArr: pass else: r+=[i] return r def search(b1,b2,b3,b4): global ans n1 = list(itertools.permutations(b1, 4)) n2 = list(itertools.permutations(b2, 4)) n3 = list(itertools.permutations(b3, 4)) n4 = list(itertools.permutations(b4, 4)) for i in n1: for j in n2: for k in n3: for l in n4: a=list(i)+list(j)+list(k)+list(l) if sum(a[0:16:4])==34: if sum(a[1:16:4])==sum(a[2:16:4])==sum(a[0:16:5])==sum(a[3:13:3])==34: s=makeline(a) if s in ans: pass else: print(s) ans+=[s] appendtext(s) #return #print( makeline([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]) ) st=time.time() n = list(itertools.combinations(a16, 4)) c=0 for i in n: b1=list(i) if sum(b1)==34: a12=delete_arr(a16,b1) n1 = list(itertools.combinations(a12, 4)) for j in n1: b2=list(j) if sum(b2)==34: a8=delete_arr(a12,b2) n2 = list(itertools.combinations(a8, 4)) for k in n2: b3=list(k) if sum(b3)==34: b4=delete_arr(a8,b3) c+=1 if c%100==0: print("**",b1,b2,b3,b4) print(c,":",time.time()-st) search(b1,b2,b3,b4)
実行ファイルのフォルダにmemo.txtも必要
linuxようなので他の環境だと改行、pathの指定で動かないかも

1時間ほどで終了

7040個ある
この1行を8文字ずつで改行すると4x4の魔法陣になります(人力では1度も確認してませんが)
ということで6x6に挑戦

残念ながらまったく動きません。
それならばと5x5も作ってみました。
残念ながらまったく動きません。
4x4だと列の入れ替えが(4x3x2)の4乗 331776回なのですが
6x6だと列の入れ替えが720の6乗 139314069504000000回
5x5でも列の入れ替えが120の5乗 24883200000回
4x4だとこの入れ替えを9500回近く回すと全パターン作成できます。
5x5だと1時間で1パターン回せるかどうか
6x6だと0が7つ違うので100年で1パターンぐらいでしょうか?
その1パターンで魔法陣が見つかるとはかぎりません。