生徒が大きな数字で魔法陣作ったら検証が大変だと言っていたので検証スクリプトを書いてみました。
プログラミングは素人なので、職業プログラマの方が見られた際はどうか大目に見てください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
### 設定値 row_l = 3 column_l = 3 ### 魔法陣かどうか調べる数列の設定 # 行1の列123の数値、 # 行2の列123の数値、 # 行3の列123の数値、の順で入力。 # member = [ # 5678917891453663528, # 5678917891453663521, # 5678917891453663526, # 5678917891453663523, # 5678917891453663525, # 5678917891453663527, # 5678917891453663524, # 5678917891453663529, # 5678917891453663522, # ] # member = [1,2,3,4,5,6,7,8,9] member = [8,1,6,3,5,7,4,9,2] ### 使用変数定義 two_d_arr = [] num = 0 row_sum = [] column_sum = [] diagonal_sum = [0,0] magic_is = True ### 数列から魔法陣を構築 # 魔法陣用に二次元配列を定義 for i in range(row_l): two_d_arr.append([]) for j in range(column_l): two_d_arr[i].append(0) # 用意した二次元配列に入力された魔法陣数列を配置 for i in range(row_l): for j in range(column_l): two_d_arr[i][j] = member[num] num += 1 # num変数を一応初期化 num = 0 # 後の処理のために魔法陣の二次元配列を転置した配列を準備 two_d_arr_t = [list(x) for x in zip(*two_d_arr)] # print("転置テスト", two_d_arr, two_d_arr_t) ### 行(row)と列(column)について、それぞれの和を算出し配列に格納 for i in range(row_l): row_sum.append(sum(two_d_arr[i])) for i in range(column_l): column_sum.append(sum(two_d_arr_t[i])) # print("sumテスト", row_sum, column_sum) ### 行と列それぞれの和が全て一致するか確認 # 各行の和の一致確認 for i in range(row_l): if i+1 == row_l: break if magic_is == True: if row_sum[i] != row_sum[i+1]: magic_is = False print(i+1,"行と",i+2,"行の和が一致しません。") if magic_is == True: print("各行の和は ",row_sum[0],"で一致しました。") # 各列の和の一致確認 for i in range(column_l): if i+1 == column_l: break if magic_is == True: if column_sum[i] != column_sum[i+1]: magic_is = False print(i+1,"列と",i+2,"列の和が一致しません。") if magic_is == True: print("各列の和は ",column_sum[0],"で一致しました。") # 行の和と列の和の一致の確認 if magic_is == True: if row_sum[0] == column_sum[0]: print("行和と列和が一致しました。") else: magic_is = False print("行和と列和が一致しません。") ### 正方行列の場合のみ、斜めの和が一致するかも確認 if row_l == column_l: for i in range(row_l): diagonal_sum[0]+=two_d_arr[i][i] diagonal_sum[1]+=two_d_arr[i][row_l-1 - i] # 配列長(1base)-1=配列番号(0base) (1origin->0origin) if diagonal_sum[0] == diagonal_sum[1]: print("斜めの和は",diagonal_sum[0],"で一致しました。") else: magic_is = False print("この魔法陣は正方形ですが、斜めの和は\n\ 左上から右下が",diagonal_sum[0], "右上から左下が",diagonal_sum[1], "\nで、一致しませんでした。") else: print("この魔法陣は正方形ではありませんので、斜めの和を検証しませんでした。") ### 結果の表示 if magic_is == True: if row_sum[0] == column_sum[0] == diagonal_sum[0]: print("縦の和、横の和、斜めの和がそれぞれ全て一致しました。\n魔法陣として正しいと確認できました。") else: print("この魔法陣は魔法陣として正しいとはいえません。") # print(magic_is) |
row_l=5
column_l=5
member=[17,24,1,8,15,23,5,7,14,16,4,6,13,20,22,10,12,19,21,3,11,18,25,2,9]
と書き換えると、5次魔法陣でも検証できます。