generated from public/aoc_template
day21 - slightly cheated
This commit is contained in:
parent
dbd7c236a9
commit
fc80c822a2
195
day21.py
Normal file
195
day21.py
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
from tools.aoc import AOCDay
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
ARROW_PATHS = {
|
||||||
|
("A", "<"): "v<<",
|
||||||
|
("A", ">"): "v",
|
||||||
|
("A", "^"): "<",
|
||||||
|
("A", "v"): "<v",
|
||||||
|
("^", "<"): "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"): "<v",
|
||||||
|
("3", "1"): "<<",
|
||||||
|
("3", "2"): "<",
|
||||||
|
("3", "4"): "<<^",
|
||||||
|
("3", "5"): "<^",
|
||||||
|
("3", "6"): "^",
|
||||||
|
("3", "7"): "<<^^",
|
||||||
|
("3", "8"): "<^^",
|
||||||
|
("3", "9"): "^^",
|
||||||
|
("4", "A"): ">>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"): "<v",
|
||||||
|
("5", "2"): "v",
|
||||||
|
("5", "3"): "v>",
|
||||||
|
("5", "4"): "<",
|
||||||
|
("5", "6"): ">",
|
||||||
|
("5", "7"): "<^",
|
||||||
|
("5", "8"): "^",
|
||||||
|
("5", "9"): "^>",
|
||||||
|
("6", "A"): "vv",
|
||||||
|
("6", "0"): "<vv",
|
||||||
|
("6", "1"): "<<v",
|
||||||
|
("6", "2"): "<v",
|
||||||
|
("6", "3"): "v",
|
||||||
|
("6", "4"): "<<",
|
||||||
|
("6", "5"): "<",
|
||||||
|
("6", "7"): "<<^",
|
||||||
|
("6", "8"): "<^",
|
||||||
|
("6", "9"): "^",
|
||||||
|
("7", "A"): ">>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"): "<vv",
|
||||||
|
("8", "2"): "vv",
|
||||||
|
("8", "3"): "vv>",
|
||||||
|
("8", "4"): "<v",
|
||||||
|
("8", "5"): "v",
|
||||||
|
("8", "6"): "v>",
|
||||||
|
("8", "7"): "<",
|
||||||
|
("8", "9"): ">",
|
||||||
|
("9", "A"): "vvv",
|
||||||
|
("9", "0"): "<vvv",
|
||||||
|
("9", "1"): "<<vv",
|
||||||
|
("9", "2"): "<vv",
|
||||||
|
("9", "3"): "vv",
|
||||||
|
("9", "4"): "<<v",
|
||||||
|
("9", "5"): "<v",
|
||||||
|
("9", "6"): "v",
|
||||||
|
("9", "7"): "<<",
|
||||||
|
("9", "8"): "<",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_arrow_path(code: str, paths: dict[tuple[str, str], str]) -> 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)
|
||||||
5
inputs/input21
Normal file
5
inputs/input21
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
671A
|
||||||
|
083A
|
||||||
|
582A
|
||||||
|
638A
|
||||||
|
341A
|
||||||
5
inputs/input21_jonathan
Normal file
5
inputs/input21_jonathan
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
208A
|
||||||
|
540A
|
||||||
|
685A
|
||||||
|
879A
|
||||||
|
826A
|
||||||
5
inputs/input21_test
Normal file
5
inputs/input21_test
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
029A
|
||||||
|
980A
|
||||||
|
179A
|
||||||
|
456A
|
||||||
|
379A
|
||||||
1
inputs/input21_test2
Normal file
1
inputs/input21_test2
Normal file
@ -0,0 +1 @@
|
|||||||
|
3A
|
||||||
Loading…
Reference in New Issue
Block a user