2017-07-01 10 views
-2

マジックスクエアを作る際に問題があります。マジックスクエアは、行と列のすべてに同じ合計を持つ数値の2乗です。 例:
私は私のコードで何が間違っている見当がつかないが、そこからmagicin.txtとブルートフォースの正方形からの3つの数字を読み書きすることになっていますmagicout.txtの出力"マジックスクエア"が動作しないようにするコード

これはAIOの練習問題に含まれているため、私はこれをコーディングしています。ウェブサイトは次のとおりです。 http://orac.amt.edu.au/cgi-bin/train/problem.pl?set=aio16int&problemid=902

さらに詳しい説明が必要な場合は、コメントしてください。コードは(それは無用プリントの束を持っているとデバッグのための文を「キーを押して終了します」)ここにある:

def Main(): 
file=open("magicin.txt","r") 
magicin=file.read() 
file.close() 
num1="" 
num2="" 
num3=0 
num4="" 
num5=0 
num6=0 
num7=0 
num8=0 
num9=0 
indices = [i for i, x in enumerate(magicin) if x == " "] 
splitSpace2=indices[1] 
splitSpace=indices[0] 
for x in range(splitSpace): 
    num1+=magicin[x] 
for x in range(splitSpace+1,splitSpace2): 
    num2+=magicin[x] 
for x in range(splitSpace2+1,len(magicin)): 
    num4+=magicin[x] 
num1=int(num1) 
num2=int(num2) 
num4=int(num4) 
for x in range(20): 
    num3=x 
    sum=num1+num2+num3 
    num7=sum-num1 
    if num7<0: 
     print("Falied with num7="+str(num7)) 
    else: 
     for y in range(20): 
      num5=y 
      for z in range(20): 
       num6=z 
       if num6+num5+num4==sum: 
        for a in range(20): 
         num8=a 
         if num8+num2+num5==sum: 
          for b in range(20): 
           num9=b 
           if num9+num8+num7==sum and num9+num6+num3==sum: 
            answer=[str(num1),str(num2),str(num3),str(num4),str(num5),str(num6),str(num7),str(num8),str(num9)] 
            file=open("magicout.txt","w") 
            file.write(answer[0]+" "+answer[1]+" "+answer[2]+"\n"+answer[3]+" "+answer[4]+" "+answer[5]+"\n"+answer[6]+" "+answer[7]+" "+answer[8]) 
            file.close() 
            return 
           else: 
            print("failed with num9+num8+num7==sum and num9+num6+num3==sum"+" "+str(num9)+" "+str(num8)+" "+str(num7)+" "+str(sum),str(num9),str(num6),str(num3),str(sum)) 

         else: 
          print("Failed with num8+num2+num5==sum",str(num8),str(num2),str(num5),str(sum)) 

       else: 
        print("Failed with num6="+str(num6)+" num5="+str(num5),"num4="+str(num4),"sum="+str(sum)) 
    if x==19: 
     print(num1,num2,num3,num4,num5,num6,num7,num8,num9) 
     wait=input("") 
     file=open("magicout.txt","w") 
     file.write("none") 
     file.close() 
answer=Main() 

答えて

2

ありがとう私は最近、この問題を終了し、それが実際に一見簡単です。通常のマジックスクエアでは、数字を繰り返すことはできません。しかし、AIOの問題では、必要なだけ頻繁に番号を繰り返すことができます。このため、驚くべき対称性が生じる。

私はマジックナンバーは、mも私は次の形式で私の魔方陣を書き出すことができましょう場合:

a  b  m-(a+b 
c  m-(b+c) b 
m-(a+c) c  a 

そのため、あなたは簡単な数学で魔方陣を作成することができます。 m-(a+c)m-(a+b)のうち大きい方が1と20の間になるように、mをテストするだけです。これが真であるかどうかを確認するには、実際に行う必要があります。正方形の中央の数字が1より大きいかどうかを確認するだけです。どんな状況においても、他の数字はいつもうまくいくでしょう。このことから、私はPythonで、次のコードを作っ:

infile = open("magicin.txt", "r") 
outfile = open("magicout.txt", "w") 
split = infile.readline().split() 
n1 = int(split[0]) 
n2 = int(split[1]) 
n4 = int(split[2]) 
square = [ [n1, n2, 0], [n4, 0, 0], [0, 0, 0]] 
minmagic = max(square[0][0] + square[0][1], square[0][0] + square[1][0]) + 1 #lowest possible magic number 
maxmagic = max(square[0][0] + square[0][1], square[0][0] + square[1][0]) +20 #highest possible magic number 
for magic in range(minmagic, maxmagic + 1): 
square[2][0] = magic - (square[0][0] + square[1][0]) #fill bottom left corner 
square[0][2] = magic - (square[0][0] + square[0][1]) #fill top right corner 
square[2][2] = square[0][0] #fill bottom right 
square[2][1] = square[1][0] #fill bottom edge 
square[1][2] = square[0][1] #fill right edge 
square[1][1] = magic - (square[0][1] + square[2][1]) #fill middle of square 
if square[1][1] > 0: # if middle is greater than 0, you've found a square, so break the for loop. 
    break 
outfile.write(str(square[0][0]) + " " + str(square[0][1]) + " " + str(square[0][2]) + "\n") 
outfile.write(str(square[1][0]) + " " + str(square[1][1]) + " " + str(square[1][2]) + "\n") 
outfile.write(str(square[2][0]) + " " + str(square[2][1]) + " " + str(square[2][2]) + "\n") 

私はこれが助けを願って!

+0

あなたがサイズnの可能性のあるすべての魔法の四角を作るように求められたら、それは面白いです... –

+0

@IrmendeJongこれらの四角形の半数の魔法の性質を繰り返すことを許していれば(対角線は関係ありません)、可能な正方形の数はnが増えるにつれて大規模に大きくなるだろう。一方、「真の」魔方陣を見つけることは、別の問題です。 –

関連する問題