def queens_problem(n): board = make_board(n) return conjoin( flatten(exactly_one(row) for row in board), flatten(at_most_one(col) for col in transpose(board)), flatten(at_most_one(diag) for diag in rising_diagonals(board)), flatten(at_most_one(diag) for diag in falling_diagonals(board)))
def make_sudoku_grid(n): problem = [] def add_permutation(slots): for variables in transpose(slots): problem.extend(at_most_one(variables)) make_variable = count(1).next def make_slot(): slot = [make_variable() for i in range(n*n)] problem.extend(exactly_one(slot)) return slot def make_block(): block = [[make_slot() for c in range(n)] for r in range(n)] add_permutation(flatten(block)) return block superblock = [[make_block() for c in range(n)] for r in range(n)] rows = flatten([map(flatten, transpose(row)) for row in superblock]) for row in rows: add_permutation(row) for column in transpose(rows): add_permutation(column) return rows, problem
def make_sudoku_grid(n): problem = [] def add_permutation(slots): for variables in transpose(slots): problem.extend(at_most_one(variables)) make_variable = count(1).next def make_slot(): slot = [make_variable() for i in range(n * n)] problem.extend(exactly_one(slot)) return slot def make_block(): block = [[make_slot() for c in range(n)] for r in range(n)] add_permutation(flatten(block)) return block superblock = [[make_block() for c in range(n)] for r in range(n)] rows = flatten([map(flatten, transpose(row)) for row in superblock]) for row in rows: add_permutation(row) for column in transpose(rows): add_permutation(column) return rows, problem
def make_block(): block = [[make_slot() for c in range(n)] for r in range(n)] add_permutation(flatten(block)) return block