知恵袋で見つけた計算ブロックの問題をPythonで解いてみました。(^_^;
ルール
①図のマスに1から6までの数字を1つずついれます。
②どの列(縦●横とも)にも1から6までの数字が1つずついれます。
③ブロックの中の数字は太線で囲まれたブロックの数の和になります。
0 1 2 3 4 5 +---+---+---+---+---+---+ 0 |13 |16 | + +---+---+---+---+---+ 1 | |3 |11 |7 | +---+---+ + +---+---+ 2 |5 | | |6 |8 | + +---+---+---+ + + 3 | |15 | | | +---+---+---+---+---+---+ 4 |10 |6 |11 | + +---+---+---+---+---+ 5 | |9 |6 | +---+---+---+---+---+---+
ただし、外側の数字は、プログラム用の配列のインデックスです。
● CalcBlocks1.py
# coding: UTF-8 # CalcBlocks1.py from time import time import itertools def toStr(lst): return '[%s]'%','.join(['%s'%x for x in lst]) # 列がダブっていないか調べる def isDuplicated(n,li2D): m = len(li2D) for i in range(m): li = [li2D[j][i] for j in range(n)] if len(set(li))!=n: return True return False def main(): tm = time() # Timer Start m = [[0]*6]*6 R = range(1,7) Perm = [list(itertools.permutations(R))]*5 for m[0] in Perm[0]: if m[0][1]+m[0][2]+m[0][3]+m[0][4]+m[0][5]!=16: continue for m[1] in Perm[1]: if m[0][0]+m[1][0]+m[1][1]!=13: continue if m[1][4]+m[1][5]!=7: continue if isDuplicated(2,m): continue for m[2] in Perm[2]: if m[1][2]+m[2][2]!= 3: continue if m[1][3]+m[2][3]!=11: continue if isDuplicated(3,m): continue for m[3] in Perm[3]: if m[2][0]+m[2][1]+m[3][0]!= 5: continue if m[3][1]+m[3][2]+m[3][3]!=15: continue if m[2][4]+m[3][4]!= 6: continue if m[2][5]+m[3][5]!= 8: continue if isDuplicated(4,m): continue for m[4] in Perm[4]: if m[4][1]+m[4][2]+m[4][3]!= 6: continue if m[4][4]+m[4][5]!=11: continue if isDuplicated(5,m): continue for i in range(6): li = [m[j][i] for j in range(5)] m[5][i] = 21-sum(li) if m[4][0]+m[5][0]!=10: continue if m[5][1]+m[5][2]!= 9: continue if m[5][3]+m[5][4]+m[5][5]!= 6: continue # チェックを潜り抜けたものだけを表示 for n in range(6): print(toStr(m[n])) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
[5,3,4,2,6,1] [2,6,1,5,3,4] [3,1,2,6,4,5] [1,5,6,4,2,3] [4,2,3,1,5,6] [6,4,5,3,1,2] Runtime : 0.625 [sec]
※参考URL
●判断推理のダンスのペアの問題をPythonで解いてみた。
●計算ブロックの問題をPythonで解いてみた。(2)
- 作者: 宮本哲也
- 出版社/メーカー: ディスカヴァー・トゥエンティワン
- 発売日: 2013/09/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る