def rule2(puzzle, pencil, steps): #single-square candidate applied = False for num in range(1, 10): row, col = findIndex(pencil, num) if not row == 111: puzzle[row][col] = num #steps.append(("Single-square candidate: placed number", num, "in", "cell (%r,%r)" % (row+1, col+1))) puzzle, pencil = refresh(puzzle) applied = True pencilCols = ch.convertToCols(pencil) row, col = findIndex(pencilCols, num) if not row == 111: pencilCols[row][col] = [100] pencilCols = ch.convertToCols(pencilCols) row, col = findItem(pencilCols, [100]) puzzle[row][col] = num #steps.append(("Single-square candidate: placed number", num, "in", "cell (%r,%r)" % (row+1, col+1))) puzzle, pencil = refresh(puzzle) applied = True pencilGrids = ch.convertToGrids(pencil) gridRow, row, col = findIndex2(pencilGrids, num) if not row == 111: pencilGrids[gridRow][row][col] = [100] pencilGrids = ch.convertToPuzzle(pencilGrids) row, col = findItem(pencilGrids, [100]) puzzle[row][col] = num #steps.append(("Single-square candidate: placed number", num, "in", "cell (%r,%r)" % (row+1, col+1))) puzzle, pencil = refresh(puzzle) applied = True return puzzle, pencil, applied, steps
def execute(puzzle): pencil = {} for row in range(9): for col in range(9): ls = [] if puzzle[row][col] == 0: cols = ch.convertToCols(puzzle) grids = ch.convertToGrids(puzzle) for num in range(1, 10): cpuzzle = ch.crosshatching(num, puzzle, cols, grids) if cpuzzle[row][col] == 0: ls.append(num) if puzzle[row][col] == 0 and len(ls) == 1: pencil[row, col] = ls if not len(pencil) == 0: for key, value in pencil.items(): puzzle[key[0]][key[1]] = value[0] return puzzle, pencil
def refresh(puzzle): pencil = [] for row in range(9): for col in range(9): ls = [] if puzzle[row][col] == 0: cols = ch.convertToCols(puzzle) grids = ch.convertToGrids(puzzle) for num in range(1, 10): cpuzzle = ch.crosshatching(num, puzzle, cols, grids) if cpuzzle[row][col] == 0: ls.append(num) pencil.append(ls) pencil2 = [[] for x in range(9)] loop = 0 for i in pencil: pencil2[int(loop/9)].append(i) loop += 1 return puzzle, pencil2
def rule6(puzzle, pencil, steps): applied = False for row in range(0, 9): for col in range(0, 9): candidate = pencil[row][col] if len(candidate) > 2: for r in range(2, len(candidate)-1): combs = itertools.combinations(candidate, r) for part in combs: locs = [col] for col2 in range(0, 9): if col2 not in locs: if checkLists(pencil[row][col2], part): locs.append(col2) if len(locs) == r: for col3 in range(0, 9): if col3 not in locs: pencil, applied, steps = modifyLists(pencil, row, col3, part, applied, steps, "row") #applied = True print("DID IT") pencilCols = ch.convertToCols(pencil) for row in range(0, 9): for col in range(0, 9): candidate = pencilCols[row][col] if len(candidate) > 2: for r in range(2, len(candidate)-1): combs = itertools.combinations(candidate, r) for part in combs: locs = [col] for col2 in range(0, 9): if col2 not in locs: if checkLists(pencilCols[row][col2], part): locs.append(col2) if len(locs) == r: for col3 in range(0, 9): if col3 not in locs: pencilCols, applied, steps = modifyLists(pencilCols, row, col3, part, applied, steps, "col") #applied = True print("DID IT") pencil = ch.convertToCols(pencilCols) pencilGrids = ch.convertToGrids(pencil) for gridRow in range(0, 3): for grid in range(0, 3): for item in range(0, 9): candidate = pencilGrids[gridRow][grid][item] if len(candidate) > 2: for r in range(2, len(candidate)-1): combs = itertools.combinations(candidate, r) for part in combs: locs = [item] for col2 in range(0, 9): if col2 not in locs: if checkLists(pencilGrids[gridRow][grid][col2], part): locs.append(col2) if len(locs) == r: for col3 in range(0, 9): if col3 not in locs: pencilGrids, applied, steps = modifyLists(pencilGrids, gridRow, grid, part, applied, steps, "grid", col3) #applied = True print("DID IT") pencil = ch.convertToPuzzle(pencilGrids) return puzzle, pencil, applied, steps
def rule5(puzzle, pencil, steps): #triples applied = False for row in range(0, 9): for loc1 in range(0, 9): triple1 = pencil[row][loc1] for loc2 in range(0, 9): triple2 = pencil[row][loc2] for loc3 in range(0, 9): triple3 = pencil[row][loc3] if not loc3 == loc2 and not loc2 == loc1 and not loc1 == loc3 and not triple1 == [] and not triple2 == [] and not triple3 == []: if checkTriple(triple1, triple2, triple3) == True: locations = [loc1, loc2, loc3] ls = checkTriple(triple1, triple2, triple3, True) for x in range(0, 9): if not x in locations: for num in ls: if num in pencil[row][x]: pencil[row][x].remove(num) #steps.append(("Triples: ",triple1,"in cell (%r,%r),(%r,%r),(%r,%r). Removed", num, "from candidate list in cell (%r,%r)" % (row+1,loc1+1,row+1,loc2+1,row+1,loc3+1,row+1,x+1))) steps += 1 applied = True for row in range(0, 9): pencilCols = ch.convertToCols(pencil) for loc1 in range(0, 9): triple1 = pencilCols[row][loc1] for loc2 in range(0, 9): triple2 = pencilCols[row][loc2] for loc3 in range(0, 9): triple3 = pencilCols[row][loc3] if not loc3 == loc2 and not loc2 == loc1 and not loc1 == loc3 and not triple1 == [] and not triple2 == [] and not triple3 == []: if checkTriple(triple1, triple2, triple3) == True: locations = [loc1, loc2, loc3] ls = checkTriple(triple1, triple2, triple3, True) for x in range(0, 9): if not x in locations: for num in ls: if num in pencilCols[row][x]: pencilCols[row][x].remove(num) #steps.append(("Triples: ",triple1,"in cell (%r,%r),(%r,%r),(%r,%r). Removed", num, "from candidate list in cell (%r,%r)" % (loc1+1,row+1,loc2+1,row+1,loc3+1,row+1,x+1,row+1))) steps += 1 applied = True pencil = ch.convertToCols(pencilCols) pencilGrids = ch.convertToGrids(pencil) for gridRow in range(0, 3): for grid in range(0, 3): for loc1 in range(0, 9): triple1 = pencilGrids[gridRow][grid][loc1] for loc2 in range(0, 9): triple2 = pencilGrids[gridRow][grid][loc2] for loc3 in range(0, 9): triple3 = pencilGrids[gridRow][grid][loc3] if not loc3 == loc2 and not loc2 == loc1 and not loc1 == loc3 and not triple1 == [] and not triple2 == [] and not triple3 == []: if checkTriple(triple1, triple2, triple3) == True: locations = [loc1, loc2, loc3] ls = checkTriple(triple1, triple2, triple3, True) for x in range(0, 9): if not x in locations: for num in ls: if num in pencilGrids[gridRow][grid][x]: pencilGrids[gridRow][grid][x].remove(num) steps += 1 applied = True pencil = ch.convertToPuzzle(pencilGrids) if applied == True: print("RULE5") ch.showPuzzle(pencil) return puzzle, pencil, applied, steps
def rule4(puzzle, pencil, steps): #pairs applied = False for row in range(0, 9): for loc1 in range(0, 9): twin1 = pencil[row][loc1] proceed = False if len(twin1) == 2: for loc2 in range(0, 9): twin2 = pencil[row][loc2] if twin2 == twin1 and not loc2 == loc1: proceed = True loc3 = loc2 if proceed == True: twin2 = pencil[row][loc3] for num in twin1: col3 = 0 for x in pencil[row]: if num in x and not col3 == loc1 and not col3 == loc3: pencil[row][col3].remove(num) #steps.append(("Pairs:", twin1, "in cells (%r,%r) and (%r,%r). Removed", num, "from candidate list in cell (%r,%r)" % (row+1, loc1+1, row+1, loc3+1, row+1, col3+1))) steps += 1 applied = True print("RULE4") print(twin1, twin2) ch.showPuzzle(pencil) col3 += 1 pencilCols = ch.convertToCols(pencil) for row in range(0, 9): for loc1 in range(0, 9): twin1 = pencilCols[row][loc1] proceed = False if len(twin1) == 2: for loc2 in range(0, 9): twin2 = pencilCols[row][loc2] if twin2 == twin1 and not loc2 == loc1: proceed = True loc3 = loc2 if proceed == True: twin2 = pencilCols[row][loc3] for num in twin1: col3 = 0 for x in pencilCols[row]: if num in x and not col3 == loc1 and not col3 == loc3: pencilCols[row][col3].remove(num) #steps.append(("Pairs:", twin1, "in cells (%r,%r) and (%r,%r). Removed", num, "from candidate list in cell (%r,%r)" % (loc1+1, row+1, loc3+1, row+1, col3+1, row+1))) steps += 1 applied = True print("RULE4") print(twin1, twin2) ch.showPuzzle(pencil) col3 += 1 pencil = ch.convertToCols(pencilCols) pencilGrids = ch.convertToGrids(pencil) for gridRow in range(0, 3): for grid in range(0, 3): for loc1 in range(0, 9): twin1 = pencilGrids[gridRow][grid][loc1] proceed = False if len(twin1) == 2: for loc2 in range(0, 9): twin2 = pencilGrids[gridRow][grid][loc2] if twin2 == twin1 and not loc2 == loc1: proceed = True loc3 = loc2 if proceed == True: twin2 = pencilGrids[gridRow][grid][loc3] for num in twin1: col3 = 0 for x in pencilGrids[gridRow][grid]: if num in x and not col3 == loc1 and not col3 == loc3: pencilGrids[gridRow][grid][col3].remove(num) applied = True steps += 1 print("RULE4") print(twin1, twin2) ch.showPuzzle(pencil) col3 += 1 pencil = ch.convertToPuzzle(pencilGrids) return puzzle, pencil, applied, steps
def rule3(puzzle, pencil, steps): #number claiming print("") print("RULE3") print("") applied = False for gridRow in range(0, 3): for grid in range(0, 3): box = [[],[],[]] pencilGrids = ch.convertToGrids(pencil) for loop in range(9): box[int(loop/3)].append(pencilGrids[gridRow][grid][loop]) ch.showPuzzle(pencil) boxCols = convertBoxToCols(box) for row in range(0, 3): for num in range(1, 10): ls = [0,1,2] ls.remove(row) pencilGrids = ch.convertToGrids(pencil) box = [[],[],[]] for loop in range(9): box[int(loop/3)].append(pencilGrids[gridRow][grid][loop]) boxCols = convertBoxToCols(box) if any(num in i for i in box[row]) and not any(num in i for i in box[ls[0]]) and not any(num in i for i in box[ls[1]]): for item in range(0, 3): if num in box[row][item]: itemLoc = item if itemLoc == 0: thing = [itemLoc+grid*3, itemLoc+1+grid*3, itemLoc+2+grid*3] elif itemLoc == 1: thing = [itemLoc+grid*3, itemLoc+1+grid*3, itemLoc-1+grid*3] else: thing = [itemLoc+grid*3, itemLoc-1+grid*3, itemLoc-2+grid*3] #print("watch") #print(thing) for x in thing: print(pencil[row+gridRow*3][x]) for x in range(0, 9): if not x in thing and num in pencil[row+gridRow*3][x]: pencil[row+gridRow*3][x].remove(num) #steps.append(("Number claiming: removed", num, "from candidate list in cell (%r,%r)" % (row+gridRow+1, x+1))) steps += 1 applied = True #print ("YEAHHHHHHHHHHHHHHHHHHHH") #print(row+grid*3, x) pencilGrids = ch.convertToGrids(pencil) box = [[],[],[]] for loop in range(9): box[int(loop/3)].append(pencilGrids[gridRow][grid][loop]) boxCols = convertBoxToCols(box) if any(num in i for i in boxCols[row]) and not any(num in i for i in boxCols[ls[0]]) and not any(num in i for i in boxCols[ls[1]]): for item in range(0, 3): if num in boxCols[row][item]: itemLoc = item if itemLoc == 0: thing = [itemLoc+gridRow*3, itemLoc+1+gridRow*3, itemLoc+2+gridRow*3] elif itemLoc == 1: thing = [itemLoc+gridRow*3, itemLoc+1+gridRow*3, itemLoc-1+gridRow*3] else: thing = [itemLoc+gridRow*3, itemLoc-1+gridRow*3, itemLoc-2+gridRow*3] for x in range(0, 9): if not x in thing and num in pencil[x][row+grid*3]: pencil[x][row+grid*3].remove(num) #steps.append(("Number claiming: removed", num, "from candidate list in cell (%r,%r)" % (x+1, row+grid*3+1))) steps += 1 pencilGrids = ch.convertToGrids(pencil) applied = True #print ("YEAHHHHHHHHHHHHHHHHHHHH") #print(row+gridRow*3, x) return puzzle, pencil, applied, steps