From de373ed32482bbc796227a7750971bbc0c453b68 Mon Sep 17 00:00:00 2001 From: Luna Lailatova Date: Mon, 19 Dec 2022 01:28:31 +0100 Subject: [PATCH] finished day12 --- day12-1.py | 135 ++++++++++++++++++++++++++++++++++++++++++++++++ day12-2.py | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++ in.txt | 32 ++---------- input12.txt | 41 +++++++++++++++ 4 files changed, 325 insertions(+), 27 deletions(-) create mode 100644 day12-1.py create mode 100644 day12-2.py create mode 100644 input12.txt diff --git a/day12-1.py b/day12-1.py new file mode 100644 index 0000000..e3d33c8 --- /dev/null +++ b/day12-1.py @@ -0,0 +1,135 @@ +import copy +from queue import PriorityQueue + +MAX_PRIO = ord('z') - ord('a') +log_this_is_n = 0 +n_solutions = 0 + +q = PriorityQueue() +point_cost = {} + +def log_every_n(message): + global log_this_is_n + + log_this_is_n = (log_this_is_n + 1) % 100000 + + if log_this_is_n == 0: + print(message) + + +class PossiblePath: + def __init__(self, y, x, visited): + self.x = x + self.y = y + self.visited = tuple(visited) + + def __lt__(self, other): + return (len(self.visited) < len(other.visited) or + self.x < other.x or + self.y < other.y) + + +def MakeCandidate(x, y, visited, value_diff): + if (y, x) in point_cost and point_cost[(y, x)] <= len(visited): + return + point_cost[(y, x)] = len(visited) + + prio_valuediff = value_diff * -1 + prio_distance = (max(End[0], x) - min(End[0], x)) + (max(End[1], y) - min(End[1], y)) + prio_lettervalue = MAX_PRIO - grid[y][x] + prio_pathlen = (gridX * gridY) - len(visited) + path = PossiblePath(y, x, visited) + q.put((prio_valuediff, prio_distance, path)) + + +def findPath(): + global fewestSteps + global n_solutions + while not q.empty(): + _, _, path = q.get() + + if (path.y, path.x) in point_cost and point_cost[(path.y, path.x)] < len(path.visited): + # We already have a better path to the current point. + continue + + log_every_n('Inspecting: %dx%d, visited %d points, %d solutions' % (path.x, path.y, len(path.visited), n_solutions)) + visited = list(path.visited) + if (path.y, path.x) in visited: + continue + visited.append((path.y, path.x)) + + if (not (fewestSteps == None)) and (len(visited) - 1 >= fewestSteps): + continue + if [path.x, path.y] == End: + print('Visited: ', visited) + print('Steps: ', len(visited) - 1) + fewestSteps = len(visited) - 1 + n_solutions += 1 + continue + + if path.x > 0: + if grid[path.y][path.x - 1] <= grid[path.y][path.x] + 1: + valDiff = grid[path.y][path.x - 1] - grid[path.y][path.x] + MakeCandidate(path.x - 1, path.y, visited, valDiff) + if path.x < gridX: + if grid[path.y][path.x + 1] <= grid[path.y][path.x] + 1: + valDiff = grid[path.y][path.x + 1] - grid[path.y][path.x] + MakeCandidate(path.x + 1, path.y, visited, valDiff) + if path.y > 0: + if grid[path.y - 1][path.x] <= grid[path.y][path.x] + 1: + valDiff = grid[path.y - 1][path.x] - grid[path.y][path.x] + MakeCandidate(path.x, path.y - 1, visited, valDiff) + if path.y < gridY: + if grid[path.y + 1][path.x] <= grid[path.y][path.x] + 1: + valDiff = grid[path.y + 1][path.x] - grid[path.y][path.x] + MakeCandidate(path.x, path.y + 1, visited, valDiff) + + +with open('input12.txt','r') as f: + inp = f.read().splitlines(keepends=False) + +grid = [] +fewestSteps = None + + +for i in range(len(inp)): + grid.append([]) + for j in range(len(inp[i])): + if inp[i][j] == 'S': + Start = [j, i] + grid[i].append(0) + elif inp[i][j] == 'E': + End = [j, i] + grid[i].append(ord('z') - ord('a')) + else: + grid[i].append(ord(inp[i][j])-ord('a')) + +gridX = len(grid[0]) - 1 +gridY = len(grid) - 1 + +_x = Start[0] +_y = Start[1] + +if Start[0] > 0: + if grid[_y][_x - 1] <= 1: + MakeCandidate(_x - 1, _y, [(_y, _x)], grid[_y][_x - 1]) +if Start[0] < gridX: + if grid[_y][_x + 1] <= 1: + MakeCandidate(_x + 1, _y, [(_y, _x)], grid[_y][_x + 1]) +if Start[1] > 0: + if grid[_y - 1][_x] <= 1: + MakeCandidate(_x, _y - 1, [(_y, _x)], grid[_y - 1][_x]) +if Start[1] < gridY: + if grid[_y + 1][_x] <= 1: + MakeCandidate(_x, _y + 1, [(_y, _x)], grid[_y + 1][_x]) + +findPath() + +print(fewestSteps) +#for x in grid: +# tempa = '' +# for y in x: +# tempa += chr(y + 97) +# print(tempa) + + \ No newline at end of file diff --git a/day12-2.py b/day12-2.py new file mode 100644 index 0000000..64617fb --- /dev/null +++ b/day12-2.py @@ -0,0 +1,144 @@ +import copy +from queue import PriorityQueue + +MAX_PRIO = ord('z') - ord('a') +#log_this_is_n = 0 +n_solutions = 0 + +q = PriorityQueue() + + +#def log_every_n(message): +# global log_this_is_n + +# log_this_is_n = (log_this_is_n + 1) % 100000 + +# if log_this_is_n == 0: +# print(message) + + +class PossiblePath: + def __init__(self, y, x, visited): + self.x = x + self.y = y + self.visited = tuple(visited) + + def __lt__(self, other): + return (len(self.visited) < len(other.visited) or + self.x < other.x or + self.y < other.y) + + +def MakeCandidate(x, y, visited, value_diff): + if (y, x) in point_cost and point_cost[(y, x)] <= len(visited): + return + point_cost[(y, x)] = len(visited) + + prio_valuediff = value_diff * -1 + prio_distance = (max(End[0], x) - min(End[0], x)) + (max(End[1], y) - min(End[1], y)) + prio_lettervalue = MAX_PRIO - grid[y][x] + prio_pathlen = (gridX * gridY) - len(visited) + path = PossiblePath(y, x, visited) + q.put((prio_valuediff, prio_distance, path)) + + +def findPath(): + global fewestSteps + global n_solutions + while not q.empty(): + _, _, path = q.get() + + if (path.y, path.x) in point_cost and point_cost[(path.y, path.x)] < len(path.visited): + # We already have a better path to the current point. + continue + + #log_every_n('Inspecting: %dx%d, visited %d points, %d solutions' % (path.x, path.y, len(path.visited), n_solutions)) + visited = list(path.visited) + if (path.y, path.x) in visited: + continue + visited.append((path.y, path.x)) + + if (not (fewestSteps == None)) and (len(visited) - 1 >= fewestSteps): + continue + if [path.x, path.y] == End: + n_solutions += 1 + print('Solution Found! Steps taken:', len(visited) - 1, 'Total Solutions', n_solutions) + fewestSteps = len(visited) - 1 + + continue + + if path.x > 0: + if grid[path.y][path.x - 1] <= grid[path.y][path.x] + 1: + valDiff = grid[path.y][path.x - 1] - grid[path.y][path.x] + MakeCandidate(path.x - 1, path.y, visited, valDiff) + if path.x < gridX: + if grid[path.y][path.x + 1] <= grid[path.y][path.x] + 1: + valDiff = grid[path.y][path.x + 1] - grid[path.y][path.x] + MakeCandidate(path.x + 1, path.y, visited, valDiff) + if path.y > 0: + if grid[path.y - 1][path.x] <= grid[path.y][path.x] + 1: + valDiff = grid[path.y - 1][path.x] - grid[path.y][path.x] + MakeCandidate(path.x, path.y - 1, visited, valDiff) + if path.y < gridY: + if grid[path.y + 1][path.x] <= grid[path.y][path.x] + 1: + valDiff = grid[path.y + 1][path.x] - grid[path.y][path.x] + MakeCandidate(path.x, path.y + 1, visited, valDiff) + + +with open('input12.txt','r') as f: + inp = f.read().splitlines(keepends=False) + +grid = [] +fewestSteps = None +Starts = [] + + +for i in range(len(inp)): + grid.append([]) + for j in range(len(inp[i])): + if inp[i][j] == 'S': + Starts.append([j, i]) + grid[i].append(0) + elif inp[i][j] == 'E': + End = [j, i] + grid[i].append(ord('z') - ord('a')) + else: + if inp[i][j] == 'a': + Starts.append([j, i]) + grid[i].append(ord(inp[i][j])-ord('a')) + +gridX = len(grid[0]) - 1 +gridY = len(grid) - 1 +loopN = 0 + +print('possible starting locations found:', len(Starts)) + +for Start in Starts: + loopN +=1 + print('Checking Location', loopN, 'out of', len(Starts)) + point_cost = {} + _x = Start[0] + _y = Start[1] + if Start[0] > 0: + if grid[_y][_x - 1] <= 1: + MakeCandidate(_x - 1, _y, [(_y, _x)], grid[_y][_x - 1]) + if Start[0] < gridX: + if grid[_y][_x + 1] <= 1: + MakeCandidate(_x + 1, _y, [(_y, _x)], grid[_y][_x + 1]) + if Start[1] > 0: + if grid[_y - 1][_x] <= 1: + MakeCandidate(_x, _y - 1, [(_y, _x)], grid[_y - 1][_x]) + if Start[1] < gridY: + if grid[_y + 1][_x] <= 1: + MakeCandidate(_x, _y + 1, [(_y, _x)], grid[_y + 1][_x]) + + findPath() + +print('The shortest path takes', fewestSteps, 'steps') +#for x in grid: +# tempa = '' +# for y in x: +# tempa += chr(y + 97) +# print(tempa) + + \ No newline at end of file diff --git a/in.txt b/in.txt index 30e09e5..433e0d2 100644 --- a/in.txt +++ b/in.txt @@ -1,27 +1,5 @@ -Monkey 0: - Starting items: 79, 98 - Operation: new = old * 19 - Test: divisible by 23 - If true: throw to monkey 2 - If false: throw to monkey 3 - -Monkey 1: - Starting items: 54, 65, 75, 74 - Operation: new = old + 6 - Test: divisible by 19 - If true: throw to monkey 2 - If false: throw to monkey 0 - -Monkey 2: - Starting items: 79, 60, 97 - Operation: new = old * old - Test: divisible by 13 - If true: throw to monkey 1 - If false: throw to monkey 3 - -Monkey 3: - Starting items: 74 - Operation: new = old + 3 - Test: divisible by 17 - If true: throw to monkey 0 - If false: throw to monkey 1 +Sabqponm +abcryxxl +accszExk +acctuvwj +abdefghi \ No newline at end of file diff --git a/input12.txt b/input12.txt new file mode 100644 index 0000000..7c5a212 --- /dev/null +++ b/input12.txt @@ -0,0 +1,41 @@ +abaaacccccccccaaaaaaccccccccccccccccaacccccccccccaacaaaaaaaaaaaaaaaaaccaaaaacccaaaaccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaa +abaaacccccccccaaaaaacccccccccccccccaaaaccccccccccaaaaaaaacaaaaaaaaaaaccaaaaaaccaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa +abaaaccccccccccaaaaacccccccccccccccaaaacccccccccccaaaaacccaaaaaaaaaacccaaaaaacccaaccccccccccccccaaaaacccccccccccccccccccccccccccccccccccccaaaaaa +abccccaaccccccaaaaacccccccccaaaaaccaaaaccccccccccccaaaaacaaaaaaaaacccccaaaaaccccccccccccccccccccaaaaacccccccccccccccccaaaccccaaaccccccccccaaacaa +abcccaaaacccccaaaaacccccccccaaaaacccccccccccccccccaaacaaaaaaaaaacccccccaaaaacccccccccccccccccccaaaaaacccccccccccccccccaaaaccaaaaccccccccccccccaa +abcccaaaaacacccccccccccccccaaaaaaccccccccccccccccccaaccaaaaacaaaaccccccccccccccccccccccccccccccaaaaaaccccccccccccccccccaaaaaaaacccccccccccccccaa +abaaaaaaaaaacccccccccccccccaaaaaaccccccccccccccccccccccaaaacccaaaccccccccccccccccccccccccccccccaaaaaacccccccccccccccciiiiijaaaaccccccccccccccccc +abaaaaaaaaaacccccccccccccccaaaaaacccccccccccccccccccccccccccccaaacccccccccccccccccccccccccccccccaaaccccccccccccccccciiiiiijjjaccccccccaaaccccccc +abccaaaaaaccccccccccccccccccaaaccccccccccccccccccccccccccccccccacccccccccccaacccccccccccccccccccccccccccccccccccccciiiiioijjjjaaccccccaaaaaacccc +abccaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaacccccccccccccccccccccccccccccccccccciiinnooojjjjjaaccaaaaaaaacccc +abccaaaaaacccccccccccccccccccccccccccccccccccccaacccccaacccccccccccccccccaaaaaacccccccccccccccccccccccccccaaaccccciiinnnoooojjjjjjkkkaaaaaaacccc +abcaaaaaaaaccccccccccccccccccccccccccccccccccccaaaccaaaaaaccccaaacccccccccaaaacccccccccccccccccccccccccccccaaaaccciiinnnouooojjjjkkkkkaaaaaccccc +abccaccccccccccccccccccaaccccccaccccccccccccaaaaaaaaaaaaaacccaaaacccccccccaaaacccccccccccccccccccccccccccaaaaaacchhinnnttuuooooookkkkkkkaaaccccc +abccccccccccccccccccaacaaaccccaaaaaaaaccccccaaaaaaaacaaaaacccaaaacccccccccaccacccccccccccccccccccccccccccaaaaacchhhhnntttuuuooooppppkkkkcaaacccc +abccccccccaaacccccccaaaaaccccccaaaaaaccccccccaaaaaacaaaaaccccaaaaccccccccccccccccccccccccccccaccccccccccccaaaaahhhhnnntttxuuuooppppppkkkcccccccc +abccccccccaaaacccccccaaaaaaccccaaaaaaccaaacccaaaaaacaaaaaccccccccccccccaaccccccccccccccaaaaaaaacccccccccccaachhhhhnnnntttxxuuuuuuuupppkkkccccccc +abccccccccaaaacccccaaaaaaaacccaaaaaaaacaaacacaaaaaaccccccccccccccccccccaacccccccccccccccaaaaaacccccccccccccchhhhmnnnntttxxxxuuuuuuupppkkcccccccc +abacccccccaaaacccccaaaaacaaccaaaaaaaaaaaaaaaaaaccaacccccccccccccccccaaaaaaaaccccccccccccaaaaaaccccccccccccchhhhmmmntttttxxxxuyyyuvvpppklcccccccc +abacccccccccccccccccacaaaccaaaaaaaaaaaaaaaaaaaccccccccccccccccccccccaaaaaaaacccccccccccaaaaaaaaccccccccccccgghmmmtttttxxxxxxyyyyvvvpplllcccccccc +abaccccccccaacccccccccaaaccaaaaaaaacaaaaaaaaaaccccccccccccccccccccccccaaaaccccccccccccaaaaaaaaaaccccccaccccgggmmmtttxxxxxxxyyyyyvvppplllcccccccc +SbaaaccccccaaacaaaccccccccaaaaaaaaacaaaaaaaaacccccccccccccccccccccccccaaaaacccccccccccaaaaaaaaaaaaacaaaccaagggmmmtttxxxEzzzzyyyvvppplllccccccccc +abaacccccccaaaaaaacccccccaaaaaaacaaccaaaaaaaccccccccccccccaaaccccccccaaaaaacccccccccccacacaaacccaaaaaaacaaagggmmmsssxxxxxyyyyyvvvqqqlllccccccccc +abaccccccccaaaaaaccacccaaaaaaaaacccccccaaaaaaccccccccccccaaaaccccccccaaccaacccccccccccccccaaaccccaaaaaaccaagggmmmssssxxwwyyyyyyvvqqqlllccccccccc +abaccccccaaaaaaaaccaacaaaccaaaaaacccccaaaaaaaccccccccccccaaaaccccccccccaacccccccccccccccccaacccccaaaaaaaaaaggggmmmssssswwyywyyyyvvqqlllccccccccc +abaccccccaaaaaaaaacaaaaacccaaaaaacccccaaacaaaccccccccccccaaaaccccccccaaaaaaccccccccccccaacccccccaaaaaaaaaaaaggggmmmossswwyywwyyvvvqqqllccccccccc +abcccccccaaaaaaaaaacaaaaaacaaccccccccaaacccccccccccccccccccccccccccccaaaaaaccccccccccccaaaaacccaaaaaaaaaaaaaaggggoooosswwywwwwvvvvqqqmlccccccccc +abccccccccccaaacaaaaaaaaaacccccccccccaaacaccccccccccccccccccccccccccccaaaaccccccccccccaaaaaccccaaacaaacccaaacagggfooosswwwwwrvvvvqqqqmmccccccccc +abccccccccccaaacccaaaaaaaacccccccccaacaaaaacccccccccccccccccccccccccccaaaaccccccccccccaaaaaacccccccaaacccaaccccfffooosswwwwrrrrrqqqqqmmccccccccc +abccccccccccaacccccccaaccccccccccccaaaaaaaacccccccccccccaaccccccccccccaccaccccccccccccccaaaacccccccaacccccccccccfffoossrwrrrrrrrqqqqmmmccccccccc +abccaaaccccccccccccccaacccccccccccccaaaaaccccccccccccaacaacccccccaaaaacccccccccccccccccaacccccccccccccccccccccccfffoossrrrrrnnnmqqmmmmmccccccccc +abcaaaaccccccccccccccccccccccccccccccaaaaacccccccccccaaaaacccccccaaaaacccaaaccccccccccccccccccccccccccccccccccccfffooorrrrrnnnnmmmmmmmccccaacccc +abcaaaacccccccccccccccccccccccccccccaaacaaccccacccccccaaaaaaccccaaaaaaccccaaaccacccccccccccccccccccccccccccccccccffoooonnnnnnnnmmmmmmccccaaacccc +abccaaacccccccccccccccccccccaaaaaccccaaccccaaaacccccaaaaaaaaccccaaaaaaccccaaaaaaaccccccccccccccccaccaccccccccccccfffooonnnnnnddddddddcccaaaccccc +abccccccccccccccccccccccccccaaaaaccccccccccaaaaaacccaaaaacaacccaaaaaaaccaaaaaaaacccccccccccccccccaaaaccccccccccccfffeonnnnneddddddddddcaaacccccc +abccccccccccaaaccccccccccccaaaaaacccccccccccaaaacccccacaaacccccaacaacccaaaaaaaaacccccccccccccccccaaaacccccccccccccffeeeeeeeeddddddddcccaaacccccc +abcccccccccaaaaccccacccccccaaaaaaccccccccccaaaaacccccccaaaacccaaacaccccaaaaaaaaaccccccccccccccccaaaaaaccccccccccccceeeeeeeeedacccccccccccccccccc +abaccccccccaaaaccccaaacaaacaaaaaaccccccccccaacaaccccccccaaaacaaaacaaacaaaaaaaaaacccccccccccccaacaaaaaacccccccccccccceeeeeeeaaacccccccccccccccaaa +abaaacccccccaaaccccaaaaaaaccaaaccccccccaaacccccccccccccccaaaaaaaacaaaaaaaaaaaaaaacacaaccaaacaaacccaacccccccccccccccccaacccaaaacccccccccccccccaaa +abaaaccccccccccccccaaaaaaccccccccccccccaaacccccccccccccccaaaaaaaccaaaaaaccaacccaccaaaaccaaaaaaaccccccccaaccccccccccccccccccaaacccccccccccccccaaa +abaaccccccccccccccaaaaaaacccccccccccaaaaaaaaccccccccccccccaaaaaaaaaaaaaacaaaccccccaaaaaccaaaaaaccccccaaaaccccccccccccccccccaaaccccccccccccaaaaaa +abaaaccccccccccccaaaaaaaaaacccccccccaaaaaaaacccccccccccaaaaaaaaaaaaaaaaaaacccccccaaaaaacaaaaaaaaaccccaaaaaacccccccccccccccccccccccccccccccaaaaaa