パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

4x4の魔法陣を解いて調子にのって6x6に挑むが1つも解けそうにない

2018-09-16 | Python
4x4の魔法陣を独自の解法で解く挑戦

今度はこんなアプローチをしてみる。
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パターンで魔法陣が見つかるとはかぎりません。



最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。