Bomb Trap (Puzzle) Checker in Python

lionaneesh's Avatar author of Bomb Trap (Puzzle) Checker in Python
This is an article on Bomb Trap (Puzzle) Checker in Python in Python.
Rated 5.00 By 1 users
My cousin recently bought a Bomb Trap puzzle, he was crazy for solving that puzzle and tried a couple of times and often came to me for rechecking his solution, and me being lazy, I thought of making a simple python script to check his solutions and save me from the brain drain.

The Code



bomb_trap.py
Code: python
#!/bin/env/python
# Checker for a 8x8 bomb trap

# Correct Solution
game = [
            [0, 0, 0, 0, 0, 0, 1, 0],
            [0, 0, 0, 0, 1, 0, 0, 0],
            [0, 0, 1, 0, 0, 0, 0, 0],
            [1, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 1, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 1],
            [0, 1, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 1, 0, 0, 0, 0]
       ]

def check_ones(array) :
    ones = 0
    for h in array:
        if isinstance(h, list) :
            ones = ones + check_ones(h)
        elif h == 1:
            ones = ones + 1
    return ones

def diagonal_check(game):
    errors = ''
    for i in range(0, 7):
        for j in range(0, 7):
                if game[i][j] != 1:
                    continue

                # diagonal 1
                diag1 = []
                h, k = i, j
                # addition loop
                while h <= 7 and h >= 0 and k <= 7 and k >= 0:
                    diag1.append(game[h][k])
                    h = h + 1
                    k = k + 1
                # subtration loop
                h, k = i-1, j-1
                while h <= 7 and h >= 0 and k <= 7 and k >= 0:
                    diag1.append(game[h][k])
                    h = h - 1
                    k = k - 1

                # diagonal 2
                diag2 = []
                # add k loop
                h, k = i, j
                while h <= 7 and h >= 0 and k <= 7 and k >= 0:
                    diag2.append(game[h][k])
                    h = h - 1
                    k = k + 1

                # add h loop
                h, k = i + 1, j - 1
                while h <= 7 and h >= 0 and k <= 7 and k >= 0:
                    diag2.append(game[h][k])
                    h = h + 1
                    k = k - 1

                # at this point we have 2 diagonal arrays and we can simply check
                # for multiple 1's, if there are multiple 1's in any diag list
                # it means we have 2 points in a diagonal i.e check failed

                if check_ones(diag1) > 1:
                    errors += "Diagonal 1 check @ point [%d, %d] evaluated to FALSE\n" % (i+1, j+1)
                if check_ones(diag2) > 1:
                    errors += "Diagonal 2 check @ point [%d, %d] evaluated to FALSE\n" % (i+1, j+1)
    if errors != '':
        print errors
        return False
    return True

check1 = True # Let's be +ve ;)
errors = ''
# let the game begin

if check_ones(game) != 8:
    print "Please fill up exactly 8 places."
    exit()

for i in range(0, 7):
    horizontal = []
    vertical   = []
    for j in range(0, 7):
        horizontal.append(game[i][j])
        vertical.append(game[j][i])
    if check_ones(horizontal) > 1:
        errors += "Multiple mines in Horizontal, @ Row [%d]\n" % (i + 1)
    if check_ones(vertical) > 1:
        errors += "Multiple mines in Vertical,  @ Column [%d]\n" % (i + 1)

if errors != '':
    print errors
    check1 = False

# Lets do some diagonal checking now

check2 = diagonal_check(game)
if check1 and check2 :
    print "Correct :)"

After some hours of trying i was able to get the right solution. I think only 4 solutions are possible but feel free to hunt for more.
0
lionaneesh's Avatar, Join Date: Mar 2010
Invasive contributor
Edit: The problem has 12 unique solutions and 92 distinct solutions
0
Dhaval_nandu2010's Avatar, Join Date: Sep 2010
Newbie Member
Hey dude i think there are 92 solutions to it.......
And it is a sort of 8queens problem would like to check out this link....