diff --git a/python/day12/bsp.txt b/python/day12/bsp.txt new file mode 100644 index 0000000..433e0d2 --- /dev/null +++ b/python/day12/bsp.txt @@ -0,0 +1,5 @@ +Sabqponm +abcryxxl +accszExk +acctuvwj +abdefghi \ No newline at end of file diff --git a/python/day12/day12_1.py b/python/day12/day12_1.py new file mode 100644 index 0000000..51761c3 --- /dev/null +++ b/python/day12/day12_1.py @@ -0,0 +1,89 @@ +lines = open("input.txt", "r").read().splitlines() + +relief = [] +s = None +e = None +for i, line in enumerate(lines): + els = [] + for j, letter in enumerate(line): + if letter == "S": + els.append(1) + s = (i, j) + elif letter == "E": + els.append(26) + e = (i, j) + else: + els.append(ord(letter) - 96) + relief.append(els) + + +class Node: + def __init__(self, x, y): + self.x = x + self.y = y + self.g = 999999 + self.h = (e[0] - self.x) + (e[1] - self.y) + + self.parent = None + + def f(self): + return self.g + self.h + + def get_children(self): + children = [] + if self.x != 0 and relief[self.x][self.y] + 1 >= relief[self.x - 1][self.y]: + children.append(Node(self.x - 1, self.y)) + if ( + self.x != len(relief) - 1 + and relief[self.x][self.y] + 1 >= relief[self.x + 1][self.y] + ): + children.append(Node(self.x + 1, self.y)) + if self.y != 0 and relief[self.x][self.y] + 1 >= relief[self.x][self.y - 1]: + children.append(Node(self.x, self.y - 1)) + if ( + self.y != len(relief[0]) - 1 + and relief[self.x][self.y] + 1 >= relief[self.x][self.y + 1] + ): + children.append(Node(self.x, self.y + 1)) + return children + + +def a_start_search(start, goal): + start_node = Node(start[0], start[1]) + start_node.g = 0 + openSet = [start_node] + while len(openSet) > 0: + current_index, current_node = get_smallest_f(openSet) + if current_node.x == goal[0] and current_node.y == goal[1]: + return current_node.g + openSet.pop(current_index) + for child in current_node.get_children(): + tentative_gScore = current_node.g + 1 + if tentative_gScore < child.g: + child.parent = current_node + child.g = tentative_gScore + if not_in_set(child, openSet): + openSet.append(child) + return None + + +def get_smallest_f(openset): + smallest = 999999 + smallest_node = None + smallest_idx = 99999 + for idx, node in enumerate(openset): + if node.f() < smallest: + smallest = node.f() + smallest_node = node + smallest_idx = idx + return smallest_idx, smallest_node + + +def not_in_set(node, openset): + for n in openset: + if n.x == node.x and n.y == node.y: + return False + return True + + +print(a_start_search(s, e)) diff --git a/python/day12/day12_2.py b/python/day12/day12_2.py new file mode 100644 index 0000000..e69de29 diff --git a/python/day12/input.txt b/python/day12/input.txt new file mode 100644 index 0000000..3bff85e --- /dev/null +++ b/python/day12/input.txt @@ -0,0 +1,41 @@ +abaaaaacaaaacccccccccaaaaaaccccccccccccccccccccccccccccccccccaaaaaa +abaaaaacaaaaccccaaaaaaaaaacccccccccccccccccccccccccccccccccccaaaaaa +abaaacccaaaaccccaaaaaaaaaaacccaacccccccccccaacccccccccccccccccaaaaa +abaaaacccaacccccaaaaaaaaaaaaaaaaacccccccccccacccccccccccccccccccaaa +abacaacccccccccccaaaaaaaaaaaaaaaaccccccccccaacccccccccccccccccccaaa +abcccacccccccccccaaaaaaaccaaaaaaaccccccccccclllcccccacccccccccccaac +abccccccccccccccccaaaaaccccccccccccccccccclllllllcccccccccccccccccc +abaaacccccccccccccaaaaaccccccccccccccccaakklllllllcccccccccaacccccc +abaaacccccccccccacccaaaccccccccccccccccakkklpppllllccddaaacaacccccc +abaaacccaaacccccaacaaaccccccccccccccccckkkkpppppllllcddddaaaacccccc +abaacccaaaacccccaaaaaccccccccccccccccckkkkpppppppllmmddddddaaaacccc +abaaaccaaaaccccccaaaaaacaaacccccccccckkkkpppuuuppplmmmmdddddaaacccc +abaaacccaaaccccaaaaaaaacaaaaccccccckkkkkoppuuuuuppqmmmmmmdddddacccc +abcccccccccccccaaaaaaaacaaaacccccjkkkkkooppuuuuuuqqqmmmmmmmddddcccc +abccccccccccccccccaaccccaaaccccjjjjkoooooouuuxuuuqqqqqqmmmmmddecccc +abacaaccccccccccccaacccccccccccjjjjoooooouuuxxxuvvqqqqqqqmmmeeecccc +abaaaacccccccacccaccccccccccccjjjjoootuuuuuuxxxyvvvvvqqqqmmmeeecccc +abaaaaacccccaaacaaacccccccccccjjjoooottuuuuuxxyyvvvvvvvqqmnneeecccc +abaaaaaccaaaaaaaaaaccccccccaccjjjooottttxxxxxxyyyyyyvvvqqnnneeecccc +abaaaccccaaaaaaaaaacccccccaaccjjjoootttxxxxxxxyyyyyyvvqqqnnneeecccc +SbcaaccccaaaaaaaaaaccccaaaaacajjjnnntttxxxxEzzzyyyyvvvrrqnnneeccccc +abcccccccaaaaaaaaaaacccaaaaaaaajjjnnntttxxxxyyyyyvvvvrrrnnneeeccccc +abcccccccaaaaaaaaaaacccccaaaaccjjjnnnnttttxxyyyyywvvrrrnnneeecccccc +abcccccccccaaaaaaccaccccaaaaaccciiinnnnttxxyyyyyyywwrrnnnneeecccccc +abccccccccccccaaacccccccaacaaaccciiinnnttxxyywwyyywwrrnnnffeccccccc +abccccccccccccaaacccccccaccaaaccciiinnnttwwwwwwwwwwwrrrnnfffccccccc +abccccccccccccccccccccccccccccccciiinnnttwwwwsswwwwwrrrnnfffccccccc +abaaaccaaccccccccccccccccccccccccciinnnttswwwssswwwwrrroofffacccccc +abaaccaaaaaacccccccccccccccccaaacciinnntssssssssssrrrrooofffacccccc +abaccccaaaaacccccccaaacccccccaaaaciinnnssssssmmssssrrrooofffacccccc +abaacaaaaaaacccccccaaaaccccccaaaaciiinmmmssmmmmmoosroooooffaaaacccc +abaaaaaaaaaaaccccccaaaaccccccaaacciiimmmmmmmmmmmoooooooofffaaaacccc +abcaaaaaaaaaaccccccaaaaccccccccccccihhmmmmmmmhggoooooooffffaaaccccc +abcccccaaacaccccccccaaccccccccccccchhhhhhhhhhhggggggggggffaaacccccc +abaccccaacccccccccccaaaccccccccccccchhhhhhhhhhgggggggggggcaaacccccc +abaaaccccaccccccccccaaaacccaacccccccchhhhhhhaaaaaggggggcccccccccccc +abaaaccccaaacaaaccccaaaacaaaacccccccccccccccaaaacccccccccccccccaaac +abaacccccaaaaaaaccccaaaaaaaaacccccccccccccccaaacccccccccccccccccaaa +abaaaccccaaaaaaccccaaaaaaaaccccccccccccccccccaacccccccccccccccccaaa +abccccccaaaaaaaaaaaaaaaaaaacccccccccccccccccaaccccccccccccccccaaaaa +abcccccaaaaaaaaaaaaaaaaaaaaacccccccccccccccccccccccccccccccccaaaaaa