From 8b129cb7a4c2e58365a1419c7a9367992f8b5497 Mon Sep 17 00:00:00 2001 From: kram1138 Date: Sun, 5 Feb 2017 20:48:18 -0600 Subject: [PATCH] Debugging Added two commandline parameters. --selectionmode has two options for now, random and first. --debug has three options which give varying degrees of debugging printouts: none, some and all. --- .../__pycache__/makePuzzles.cpython-36.pyc | Bin 0 -> 6001 bytes Assignment1/backtrack.py | 230 ++++++++++++++++++ Assignment1/backtracking.py | 194 --------------- 3 files changed, 230 insertions(+), 194 deletions(-) create mode 100644 Assignment1/__pycache__/makePuzzles.cpython-36.pyc create mode 100644 Assignment1/backtrack.py delete mode 100644 Assignment1/backtracking.py diff --git a/Assignment1/__pycache__/makePuzzles.cpython-36.pyc b/Assignment1/__pycache__/makePuzzles.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3dd1333edc3b1888098317ec948403d51d742b0 GIT binary patch literal 6001 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 literal 0 HcmV?d00001 diff --git a/Assignment1/backtrack.py b/Assignment1/backtrack.py new file mode 100644 index 0000000..0128916 --- /dev/null +++ b/Assignment1/backtrack.py @@ -0,0 +1,230 @@ +from makePuzzles import * +from random import shuffle + +def printPuzzle(puz): + rows = len(puz) + cols = len(puz[0]) + for i in range(0, rows): + for j in range(0, cols): + print(puz[i][j], end=" ") + print("\n") + +def complete(puz, debug): + rows = len(puz) + cols = len(puz[0]) + for i in range(rows): + counti = 0 + countj = 0 + for j in range(cols): + #"raytrace" away from bulbs, setting all _ to + in a line in every direction + if puz[i][j] == "b": + k = 1 + while i + k < rows and (puz[i + k][j] == "_" or puz[i + k][j] == "+"): + puz[i + k][j] = "+" + k += 1 + k = 1 + while i - k >= 0 and (puz[i - k][j] == "_" or puz[i - k][j] == "+"): + puz[i - k][j] = "+" + k += 1 + k = 1 + while j + k < cols and (puz[i][j + k] == "_" or puz[i][j + k] == "+"): + puz[i][j + k] = "+" + k += 1 + k = 1 + while j - k >= 0 and (puz[i][j - k] == "_" or puz[i][j - k] == "+"): + puz[i][j - k] = "+" + k += 1 + k = 1 + + count = numAdjacent(puz, i, j) + #don't know how to convert the string to an int + if puz[i][j] == "0" and count != 0: + if debug == "all": + print("Incorrect on a 0") + return False + if puz[i][j] == "1" and count != 1: + if debug == "all": + print("Incorrect on a 2") + return False + if puz[i][j] == "2" and count != 2: + if debug == "all": + print("Incorrect on a 2") + return False + if puz[i][j] == "3" and count != 3: + if debug == "all": + print("Incorrect on a 3") + return False + if puz[i][j] == "4" and count != 4: + if debug == "all": + print("Incorrect on a 4") + return False + retVal = True + + if debug == "some" or debug == "all": + print("==== Check completeness") + printPuzzle(puz) + + for i in range(rows): + for j in range(cols): + if puz[i][j] == "_": + retVal = False + elif puz[i][j] == "+": + puz[i][j] = "_" + if debug == "all" and retVal == False: + print("Not all lit") + return retVal + +def numAdjacent(puz, i, j): + rows = len(puz) + cols = len(puz[0]) + count = 0 + if i > 0 and puz[i-1][j] == "b": + count += 1 + if i < rows-1 and puz[i+1][j] == "b": + count += 1 + if j > 0 and puz[i][j-1] == "b": + count += 1 + if j < cols-1 and puz[i][j+1] == "b": + count += 1 + return count + +def legal(puz, debug): + rows = len(puz) + cols = len(puz[0]) + + if debug == "some" or debug == "all": + print("==== Check legality") + printPuzzle(puz) + + for i in range(rows): + counti = 0 + countj = 0 + for j in range(cols): + if puz[i][j] == "b": + counti += 1 + if counti > 1: + if debug == "all": + print("More than one in row") + return False + elif puz[i][j] != "_": + counti = 0 + + if puz[j][i] == "b": + countj += 1 + if countj > 1: + if debug == "all": + print("More than one in column") + return False + elif puz[j][i] != "_": + countj = 0 + + count = numAdjacent(puz, i, j) + #don't know how to convert the string to an int + if puz[i][j] == "0" and count > 0: + if debug == "all": + print("Too many on a 0") + return False + if puz[i][j] == "1" and count > 1: + if debug == "all": + print("Too many on a 1") + return False + if puz[i][j] == "2" and count > 2: + if debug == "all": + print("Too many on a 2") + return False + if puz[i][j] == "3" and count > 3: + if debug == "all": + print("Too many on a 3") + return False + return True + +def getBlanks(puz): + retVal = [] + for i in range(0,len(puz)*len(puz[0])): + k = int(i/len(puz)) + j = int(i%len(puz[0])) + if puz[k][j] == "_": + retVal.append(i) + return retVal + +def selectNode(notassigned, selectionmode): + if selectionmode == "first" or "random": + return notassigned.pop() + + return notassigned.pop() + +def replaceNode(variable, notassigned, selectionmode): + if selectionmode == "first" or "random": + return notassigned.append(variable) + + +def solve(puz, selectionmode, debug): + domain = ("b", "_") + notassigned = getBlanks(puz) + if selectionmode == "random": + shuffle(notassigned) + return backtrack(puz, domain, notassigned, selectionmode, debug) + +def backtrack (puz, domain, notassigned, selectionmode, debug): + if complete(puz, debug): + return puz + + if len(notassigned)== 0: + return "back" + + variable = selectNode(notassigned, selectionmode) + + i = int(variable / len(puz)) + j = int(variable % len(puz)) + + for value in domain: + puz[i][j] = value + if value != "_" and legal(puz, debug) or value == "_": + result = backtrack(puz, domain, notassigned, selectionmode, debug) + if result != "back": + return result + + + replaceNode(variable, notassigned, selectionmode) + return "back" + +def clearSolution(puzzle): + rows = len(puzzle) + cols = len(puzzle[0]) + for i in range(rows): + for j in range(cols): + if puzzle[i][j] == 'b': + puzzle[i][j] = '_' + +def main( argv = None ): + if (argv == None ): + argv = sys.argv[1:] + parser = argparse.ArgumentParser(description='create a modified Akari Puzzle') + parser.add_argument('--width', action='store', dest='width', type=int, default=8) + parser.add_argument('--height', action='store', dest='height', type=int, default=8) + parser.add_argument('--verbose', '-v', action='count', dest='verbose', default=0) + parser.add_argument('--count', '-c', action='store', dest='count', default=1) + parser.add_argument('--solution', '-s', action='store_true', dest='solution', default=False) + parser.add_argument('--bulbs', '-b', action='store', dest='bulbs', type=int, default=-1) + parser.add_argument('--walls', '-w', action='store', dest='walls', type=int, default=-1) + parser.add_argument('--selectionmode', action='store', dest='selectionmode', type=str, default="first") + parser.add_argument('--debug', action='store', dest='debug', type=str, default="none") + + + args = parser.parse_args(argv) + + if (args.verbose > 0 ): + print('AkariMaker {0}x{1} bulbs {2} walls {3}'.format(args.width, args.height, args.bulbs, args.walls )) + + puzzle = makePuzzles(args.count, args.width, args.height, args.bulbs, args.walls, args.solution ) + + clearSolution(puzzle) + + print() + + printPuzzle(solve(puzzle, args.selectionmode, args.debug)) + + + +if __name__ == '__main__': + main() diff --git a/Assignment1/backtracking.py b/Assignment1/backtracking.py deleted file mode 100644 index a9ade60..0000000 --- a/Assignment1/backtracking.py +++ /dev/null @@ -1,194 +0,0 @@ -from makePuzzles import * - -def printPuzzle(puz): - rows = len(puz) - cols = len(puz[0]) - for i in range(0, rows): - for j in range(0, cols): - print(puz[i][j], end=" ") - print("\n") - -def complete(puz): - rows = len(puz) - cols = len(puz[0]) - for i in range(rows): - counti = 0 - countj = 0 - for j in range(cols): - #"raytrace" away from bulbs, setting all _ to + in a line in every direction - if puz[i][j] == "b": - k = 1 - while i + k < rows and (puz[i + k][j] == "_" or puz[i + k][j] == "+"): - puz[i + k][j] = "+" - k += 1 - k = 1 - while i - k >= 0 and (puz[i - k][j] == "_" or puz[i - k][j] == "+"): - puz[i - k][j] = "+" - k += 1 - k = 1 - while j + k < cols and (puz[i][j + k] == "_" or puz[i][j + k] == "+"): - puz[i][j + k] = "+" - k += 1 - k = 1 - while j - k >= 0 and (puz[i][j - k] == "_" or puz[i][j - k] == "+"): - puz[i][j - k] = "+" - k += 1 - k = 1 - - count = numAdjacent(puz, i, j) - #don't know how to convert the string to an int - if puz[i][j] == "0" and count != 0: - #print("Incorrect on a 0") - return False - if puz[i][j] == "1" and count != 1: - #print("Incorrect on a 2") - return False - if puz[i][j] == "2" and count != 2: - #print("Incorrect on a 2") - return False - if puz[i][j] == "3" and count != 3: - #print("Incorrect on a 3") - return False - if puz[i][j] == "4" and count != 4: - #print("Incorrect on a 4") - return False - retVal = True - #print("==== Check completeness") - #printPuzzle(puz) - for i in range(rows): - for j in range(cols): - if puz[i][j] == "_": - retVal = False - elif puz[i][j] == "+": - puz[i][j] = "_" - #if retVal == False: - #print("Not all lit") - return retVal - -def numAdjacent(puz, i, j): - rows = len(puz) - cols = len(puz[0]) - count = 0 - if i > 0 and puz[i-1][j] == "b": - count += 1 - if i < rows-1 and puz[i+1][j] == "b": - count += 1 - if j > 0 and puz[i][j-1] == "b": - count += 1 - if j < cols-1 and puz[i][j+1] == "b": - count += 1 - return count - -def legal(puz): - rows = len(puz) - cols = len(puz[0]) - #print("==== Check legality") - #printPuzzle(puz) - for i in range(rows): - counti = 0 - countj = 0 - for j in range(cols): - if puz[i][j] == "b": - counti += 1 - if counti > 1: - #print("More than one in row") - return False - elif puz[i][j] != "_": - counti = 0 - - if puz[j][i] == "b": - countj += 1 - if countj > 1: - #print("More than one in column") - return False - elif puz[j][i] != "_": - countj = 0 - - count = numAdjacent(puz, i, j) - #don't know how to convert the string to an int - if puz[i][j] == "0" and count > 0: - #print("Too many on a 0") - return False - if puz[i][j] == "1" and count > 1: - #print("Too many on a 1") - return False - if puz[i][j] == "2" and count > 2: - #print("Too many on a 2") - return False - if puz[i][j] == "3" and count > 3: - #print("Too many on a 3") - return False - return True - -def getBlanks(puz): - retVal = [] - for i in range(0,len(puz)*len(puz[0])): - k = int(i/len(puz)) - j = int(i%len(puz[0])) - if puz[k][j] == "_": - retVal.append(i) - return retVal - -def solve(puz): - domain = ("b", "_") - notassigned = getBlanks(puz) - return backtrack(puz, domain, notassigned) - -def backtrack (puz, domain, notassigned): - if complete(puz): - return puz - - if len(notassigned)== 0: - return "back" - val = notassigned.pop() - i = int(val/len(puz)) - j = int(val%len(puz)) - - for value in domain: - puz[i][j] = value - if value != "_" and legal(puz) or value == "_": - result = backtrack(puz, domain, notassigned) - if result != "back": - return result - - - notassigned.append(val) - return "back" - -def clearSolution(puzzle): - rows = len(puzzle) - cols = len(puzzle[0]) - for i in range(rows): - for j in range(cols): - if puzzle[i][j] == 'b': - puzzle[i][j] = '_' - -def main( argv = None ): - if (argv == None ): - argv = sys.argv[1:] - parser = argparse.ArgumentParser(description='create a modified Akari Puzzle') - parser.add_argument('--width', action='store', dest='width', type=int, default=8) - parser.add_argument('--height', action='store', dest='height', type=int, default=8) - parser.add_argument('--verbose', '-v', action='count', dest='verbose', default=0) - parser.add_argument('--count', '-c', action='store', dest='count', default=1) - parser.add_argument('--solution', '-s', action='store_true', dest='solution', default=False) - parser.add_argument('--bulbs', '-b', action='store', dest='bulbs', type=int, default=-1) - parser.add_argument('--walls', '-w', action='store', dest='walls', type=int, default=-1) - - args = parser.parse_args( argv ) - if (args.verbose > 0 ): - print('AkariMaker {0}x{1} bulbs {2} walls {3}'.format(args.width, args.height, args.bulbs, args.walls )) - - puzzle = makePuzzles(args.count, args.width, args.height, args.bulbs, args.walls, args.solution ) - - clearSolution(puzzle) - - print() - - printPuzzle(solve(puzzle)) - - - - -if __name__ == '__main__': - main()