From fc80c822a2eca53a138047713fc25ebfd51e3ce0 Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Sat, 21 Dec 2024 10:35:46 +0100 Subject: [PATCH] day21 - slightly cheated --- day21.py | 195 ++++++++++++++++++++++++++++++++++++++++ inputs/input21 | 5 ++ inputs/input21_jonathan | 5 ++ inputs/input21_test | 5 ++ inputs/input21_test2 | 1 + 5 files changed, 211 insertions(+) create mode 100644 day21.py create mode 100644 inputs/input21 create mode 100644 inputs/input21_jonathan create mode 100644 inputs/input21_test create mode 100644 inputs/input21_test2 diff --git a/day21.py b/day21.py new file mode 100644 index 0000000..c5d8eec --- /dev/null +++ b/day21.py @@ -0,0 +1,195 @@ +from tools.aoc import AOCDay +from typing import Any + +ARROW_PATHS = { + ("A", "<"): "v<<", + ("A", ">"): "v", + ("A", "^"): "<", + ("A", "v"): ""): "v>", + ("^", "A"): ">", + ("<", "A"): ">>^", + ("<", "^"): ">^", + ("<", "v"): ">", + ("v", "A"): "^>", + ("v", "<"): "<", + ("v", ">"): ">", + (">", "A"): "^", + (">", "^"): "<^", + (">", "v"): "<", +} + +KEYPAD_PATHS = { + ("A", "0"): "<", + ("A", "1"): "^<<", + ("A", "2"): "<^", + ("A", "3"): "^", + ("A", "4"): "^^<<", + ("A", "5"): "<^^", + ("A", "6"): "^^", + ("A", "7"): "^^^<<", + ("A", "8"): "<^^^", + ("A", "9"): "^^^", + ("0", "A"): ">", + ("0", "1"): "^<", + ("0", "2"): "^", + ("0", "3"): "^>", + ("0", "4"): "^^<", + ("0", "5"): "^^", + ("0", "6"): ">^^", + ("0", "7"): "^^^<", + ("0", "8"): "^^^", + ("0", "9"): "^^^>", + ("1", "A"): ">>v", + ("1", "0"): ">v", + ("1", "2"): ">", + ("1", "3"): ">>", + ("1", "4"): "^", + ("1", "5"): "^>", + ("1", "6"): ">>^", + ("1", "7"): "^^", + ("1", "8"): ">^^", + ("1", "9"): ">>^^", + ("2", "A"): "v>", + ("2", "0"): "v", + ("2", "1"): "<", + ("2", "3"): ">", + ("2", "4"): "<^", + ("2", "5"): "^", + ("2", "6"): "^>", + ("2", "7"): "<^^", + ("2", "8"): "^^", + ("2", "9"): "^^>", + ("3", "A"): "v", + ("3", "0"): ">vv", + ("4", "0"): ">vv", + ("4", "1"): "v", + ("4", "2"): "v>", + ("4", "3"): "v>>", + ("4", "5"): ">", + ("4", "6"): ">>", + ("4", "7"): "^", + ("4", "8"): "^>", + ("4", "9"): "^>>", + ("5", "A"): "vv>", + ("5", "0"): "vv", + ("5", "1"): "", + ("5", "4"): "<", + ("5", "6"): ">", + ("5", "7"): "<^", + ("5", "8"): "^", + ("5", "9"): "^>", + ("6", "A"): "vv", + ("6", "0"): ">vvv", + ("7", "0"): ">vvv", + ("7", "1"): "vv", + ("7", "2"): "vv>", + ("7", "3"): "vv>>", + ("7", "4"): "v", + ("7", "5"): "v>", + ("7", "6"): "v>>", + ("7", "8"): ">", + ("7", "9"): ">>", + ("8", "A"): "vvv>", + ("8", "0"): "vvv", + ("8", "1"): "", + ("8", "4"): "", + ("8", "7"): "<", + ("8", "9"): ">", + ("9", "A"): "vvv", + ("9", "0"): " str: + cur_pos = "A" + path = "" + for c in code: + if cur_pos != c: + path += paths[(cur_pos, c)] + + path += "A" + cur_pos = c + + return path + + +class Day(AOCDay): + inputs = [ + [ + (126384, "input21_test"), + (224326, "input21_jonathan"), + (163920, "input21"), + ], + [ + (279638326609472, "input21_jonathan"), + (204040805018350, "input21"), + ], + ] + + def get_path_len(self, code: str, num_pads: int = 2) -> int: + if num_pads == 0: + return len(code) + + if (code, num_pads) in self.DP: + return self.DP[code, num_pads] + + path = get_arrow_path(code, ARROW_PATHS) + p_len = 0 + for sub_path in path.split("A")[:-1]: + p_len += self.get_path_len(sub_path + "A", num_pads - 1) + + self.DP[code, num_pads] = p_len + return self.DP[code, num_pads] + + def get_full_len(self, num_keypads: int = 2) -> int: + ans = 0 + for code in self.getInput(): + key_pad_path = get_arrow_path(code, KEYPAD_PATHS) + ans += self.get_path_len(key_pad_path, num_keypads) * int(code[:-1]) + + return ans + + def part1(self) -> Any: + return self.get_full_len() + + def part2(self) -> Any: + return self.get_full_len(25) + + +if __name__ == "__main__": + day = Day(2024, 21) + day.run(verbose=True) diff --git a/inputs/input21 b/inputs/input21 new file mode 100644 index 0000000..90601d6 --- /dev/null +++ b/inputs/input21 @@ -0,0 +1,5 @@ +671A +083A +582A +638A +341A diff --git a/inputs/input21_jonathan b/inputs/input21_jonathan new file mode 100644 index 0000000..60ab29c --- /dev/null +++ b/inputs/input21_jonathan @@ -0,0 +1,5 @@ +208A +540A +685A +879A +826A \ No newline at end of file diff --git a/inputs/input21_test b/inputs/input21_test new file mode 100644 index 0000000..dd73dfd --- /dev/null +++ b/inputs/input21_test @@ -0,0 +1,5 @@ +029A +980A +179A +456A +379A \ No newline at end of file diff --git a/inputs/input21_test2 b/inputs/input21_test2 new file mode 100644 index 0000000..66657da --- /dev/null +++ b/inputs/input21_test2 @@ -0,0 +1 @@ +3A \ No newline at end of file