def no_zero_cell_clauses(cell_width): def no_zero_cells(i, j, row_length): """ Encodes: "Cell i, j is non-zero." """ literals = [lit(d, i, j) for d in irange(1, row_length)] return ' || '.join(literals) row_length = cell_width * cell_width clauses = [] for row in irange(1, row_length): for col in irange(1, row_length): clauses.append(no_zero_cells(row, col, row_length)) return clauses
def no_zero_cells(i, j, row_length): """ Encodes: "Cell i, j is non-zero." """ literals = [lit(d, i, j) for d in irange(1, row_length)] return ' || '.join(literals)
def exactly_one_clauses(groups, cell_width): clauses = [] num_symbols = cell_width * cell_width for group in groups: for digit in irange(1, num_symbols): clauses.append(at_least_clause(group, digit)) clauses += at_most_clauses(group, digit) return clauses
def zones(self): def zone_cells(a, b, cell_width): return [(i+1,j+1) for i in range((a-1) * cell_width, a * cell_width) for j in range((b-1) * cell_width, b * cell_width)] return [zone_cells(a, b, self.cell_width) for a in irange(1, self.cell_width) for b in irange(1, self.cell_width)]
def col_cells(j, col_length): return [(i, j) for i in irange(1, col_length)]
def columns(self): def col_cells(j, col_length): return [(i, j) for i in irange(1, col_length)] num_symbols = self.cell_width * self.cell_width return [col_cells(col, num_symbols) for col in irange(1, num_symbols)]
def row_cells(i, row_length): return [(i, j) for j in irange(1, row_length)]
def rows(self): def row_cells(i, row_length): return [(i, j) for j in irange(1, row_length)] num_symbols = self.cell_width * self.cell_width return [row_cells(row, num_symbols) for row in irange(1, num_symbols)]