計算ブロックの問題をPythonで解いてみた。

 知恵袋で見つけた計算ブロックの問題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)









強育パズル たし算計算ブロック 初級編

強育パズル たし算計算ブロック 初級編