Example #1
0
def row_col_grid_complete(puzzle, type):
    for i in range(0, 9):
        type_list = []
        if type == "rows":
            type_list = common.get_row(puzzle, i)
        elif type == "cols":
            type_list = common.get_column(puzzle, i)
        else:
            type_list = common.get_grid(puzzle, i)

        if not set(type_list) == set([1, 2, 3, 4, 5, 6, 7, 8, 9]):
            return False

    return True
Example #2
0
def eliminate_cell_values(puzzle, row_num, col_num):
    remaining_values = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    row = common.get_row(puzzle, row_num)
    remaining_values = elimate_list_values(remaining_values, row)

    col = common.get_column(puzzle, col_num)
    remaining_values = elimate_list_values(remaining_values, col)

    grid_num = common.get_grid_number(puzzle, row_num, col_num)
    grid = common.get_grid(puzzle, grid_num)
    remaining_values = elimate_list_values(remaining_values, grid)

    if len(remaining_values) == 1:
        return {'values': remaining_values, 'status': True}

    return {'values': remaining_values, 'status': False}
Example #3
0
def solve_with_method_5(puzzle, type):
    pairs = find_pairs_by_type(puzzle, type)

    if type == 'rows':
        remaining_type_list = list(pairs['rows'].keys())
    elif type == 'cols':
        remaining_type_list = list(pairs['cols'].keys())
    else:
        remaining_type_list = list(pairs['grids'].keys())

    for x in remaining_type_list:
        if type == 'rows':
            type_list = common.get_row(puzzle, x)
        elif type == 'cols':
            type_list = common.get_column(puzzle, x)
        else:
            type_list = common.get_grid(puzzle, x)

        empty_cell_pair = common.get_empty_cell_refs(type_list)
        possible_values = pairs[type][x]
        logger.debug("{} {} ({}) has a missing value pair ({})".format(
            type, x, type_list, possible_values))

        for value in possible_values:
            puzzle_copy = copy.deepcopy(puzzle)
            cell_ref = empty_cell_pair[0]

            if type == 'rows':
                r = x
                c = cell_ref
            elif type == 'cols':
                r = cell_ref
                c = x
            else:
                r = common.get_row_number_from_grid(puzzle, x, cell_ref)
                c = common.get_col_number_from_grid(puzzle, x, cell_ref)

            logger.info(
                "Attempting to solve puzzle again by updating Row {}, Col {} with value {}"
                .format(r, c, value))
            puzzle_attempt = update_cell(puzzle_copy, r, c, value)
            puzzle_attempt = solve_with_methods_1_to_4(puzzle_attempt)
            if (puzzle_attempt['status']):
                return {'puzzle': puzzle_attempt['puzzle'], 'status': True}

    return {'puzzle': puzzle, 'status': False}
Example #4
0
def grid_elimination(puzzle, grid_num):
    grid = common.get_grid(puzzle, grid_num)
    remaining_values = elimate_list_values([1, 2, 3, 4, 5, 6, 7, 8, 9], grid)

    for test_val in remaining_values:
        unsolved_cell_list = [0, 1, 2, 3, 4, 5, 6, 7,
                              8]  # When one value remains, cell is solved.

        for cell in range(0, 9):
            # Test if cell can be eliminated, as already contains value
            if grid[cell] > 0:
                unsolved_cell_list.remove(cell)
                continue

            # Test if cell can be eliminated, due to a row match.
            row_num = common.get_row_number_from_grid(puzzle, grid_num, cell)
            row = common.get_row(puzzle, row_num)
            if test_val in row:
                unsolved_cell_list.remove(cell)
                continue

            # Test if cell can be eliminated, due to a col match.
            col_num = common.get_col_number_from_grid(puzzle, grid_num, cell)
            col = common.get_column(puzzle, col_num)
            if test_val in col:
                unsolved_cell_list.remove(cell)
                continue

        if len(unsolved_cell_list) == 1:
            logger.debug(
                "Eliminated all cells in grid {} ({}) for value ({}) to reference ({})"
                .format(grid_num, grid, test_val, unsolved_cell_list[0]))
            row_num = common.get_row_number_from_grid(puzzle, grid_num,
                                                      unsolved_cell_list[0])
            col_num = common.get_col_number_from_grid(puzzle, grid_num,
                                                      unsolved_cell_list[0])
            puzzle = update_cell(puzzle, row_num, col_num, test_val)
        else:
            logger.debug(
                "All cells in row {} ({}) could not be eliminated for value ({}). Remaining cell references ({})"
                .format(grid_num, grid, test_val, unsolved_cell_list))

    return puzzle
Example #5
0
def validate_puzzle(puzzle):
    logger.info("Validating puzzle for incorrect format ({})".format(puzzle))

    for r in range(0, 9):
        row = puzzle[r]
        if not validate_row_col_grid(row, "row"):
            return False

    for c in range(0, 9):
        column = common.get_column(puzzle, c)
        if not validate_row_col_grid(column, "column"):
            return False

    for g in range(0, 9):
        grid = common.get_grid(puzzle, g)
        if not validate_row_col_grid(grid, "grid"):
            return False

    return True
Example #6
0
def find_pairs_by_type(puzzle, type):
    pairs = {'rows': {}, 'cols': {}, 'grids': {}}

    for num in range(0, 9):
        type_list = []
        if type == "rows":
            type_list = common.get_row(puzzle, num)
        elif type == "cols":
            type_list = common.get_column(puzzle, num)
        else:
            type_list = common.get_grid(puzzle, num)

        if type_list.count(0) == 2:
            remaining_pair = elimate_list_values([1, 2, 3, 4, 5, 6, 7, 8, 9],
                                                 type_list)
            logger.debug("{} ({}) had 2 cells remaining ({})".format(
                type, type_list, remaining_pair))
            pairs[type][num] = remaining_pair

    logger.info("Pairs : {}".format(json.dumps(pairs)))

    return pairs
Example #7
0
    def test_get_column(self, test_puzzle):
        first_column = common.get_column(test_puzzle, 0)
        assert first_column == [1, 4, 5, 6, 7, 0, 0, 0, 0], "First column did not match expected values."

        last_column = common.get_column(test_puzzle, 8)
        assert last_column == [0, 0, 0, 0, 0, 0, 1, 2, 9], "Last column did not match expected values."