def update_possibles(self): for i in range(81): tile = self.board[i] if tile == 0: continue self.possibles[i] = [] for group in sudoku.related_groups(i): for other_i in (oi for oi in group if oi != i): if tile in self.possibles[other_i]: self.possibles[other_i].remove(tile)
def fill_one_possibles_per_group(self): filled_this_round = 0 groups = sudoku.ROW_GROUP_INDICES + sudoku.COL_GROUP_INDICES + \ sudoku.BOX_GROUP_INDICES for g in groups: places = [set() for i in range(10)] for tile_i in g: for nbr in self.possibles[tile_i]: places[nbr].add(tile_i) for nbr in range(1, 10): if len(places[nbr]) == 1: # number can be in only one place in group, fill it tile_i = places[nbr].pop() self.board[tile_i] = nbr self.possibles[tile_i] = [] filled_this_round += 1 for rg in sudoku.related_groups(tile_i): for other_i in rg: if nbr in self.possibles[other_i]: self.possibles[other_i].remove(nbr) return filled_this_round