Пример #1
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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