Solution to problem 2 part 1 in Python

This commit is contained in:
David Doblas Jiménez 2022-02-25 16:03:11 +01:00
parent f1455f696d
commit c1e70b921c

121
src/Year_2016/P2.py Normal file
View File

@ -0,0 +1,121 @@
# --- Day 2: Bathroom Security ---
# You arrive at Easter Bunny Headquarters under cover of darkness. However, you
# left in such a rush that you forgot to use the bathroom! Fancy office
# buildings like this one usually have keypad locks on their bathrooms, so you
# search the front desk for the code.
# "In order to improve security," the document you find says, "bathroom codes
# will no longer be written down. Instead, please memorize and follow the
# procedure below to access the bathrooms."
# The document goes on to explain that each button to be pressed can be found
# by starting on the previous button and moving to adjacent buttons on the
# keypad: U moves up, D moves down, L moves left, and R moves right. Each line
# of instructions corresponds to one button, starting at the previous button
# (or, for the first line, the "5" button); press whatever button you're on at
# the end of each line. If a move doesn't lead to a button, ignore it.
# You can't hold it much longer, so you decide to figure out the code as you
# walk to the bathroom. You picture a keypad like this:
# 1 2 3
# 4 5 6
# 7 8 9
# Suppose your instructions are:
# ULL
# RRDDD
# LURDL
# UUUUD
# You start at "5" and move up (to "2"), left (to "1"), and left (you
# can't, and stay on "1"), so the first button is 1.
# Starting from the previous button ("1"), you move right twice (to "3")
# and then down three times (stopping at "9" after two moves and ignoring the
# third), ending up with 9.
# Continuing from "9", you move left, up, right, down, and left, ending
# with 8.
# Finally, you move up four times (stopping at "2"), then down once, ending
# with 5.
# So, in this example, the bathroom code is 1985.
# Your puzzle input is the instructions from the document you found at the
# front desk. What is the bathroom code?
from typing import Optional, Tuple
with open("files/P2.txt") as f:
instructions = [line for line in f.read().strip().split()]
def move_right(position: Tuple[int, int]) -> Tuple[int, int]:
_x = position[0] + 1
if 0 <= _x <= 2:
return _x, position[1]
else:
return position[0], position[1]
def move_down(position: Tuple[int, int]) -> Tuple[int, int]:
_y = position[1] - 1
if 0 <= _y <= 2:
return position[0], _y
else:
return position[0], position[1]
def move_left(position: Tuple[int, int]) -> Tuple[int, int]:
_x = position[0] - 1
if 0 <= _x <= 2:
return _x, position[1]
else:
return position[0], position[1]
def move_up(position: Tuple[int, int]) -> Tuple[int, int]:
_y = position[1] + 1
if 0 <= _y <= 2:
return position[0], _y
else:
return position[0], position[1]
def pos2num(position: Tuple[int, int]) -> Optional[int]:
num_dict = {
1: (0, 2),
2: (1, 2),
3: (2, 2),
4: (0, 1),
5: (1, 1),
6: (1, 2),
7: (0, 0),
8: (1, 0),
9: (2, 0),
}
return next((k for k, v in num_dict.items() if v == position), None)
def part_1() -> None:
secret = []
for instruction in instructions:
# 0,0 is the x,y coordinates of the bottom left position
pos = (1, 1)
for button in instruction:
if button == "D":
pos = move_down(pos)
elif button == "U":
pos = move_up(pos)
elif button == "R":
pos = move_right(pos)
elif button == "L":
pos = move_left(pos)
secret.append(pos)
secret_code = "".join(map(str, (pos2num(num) for num in secret)))
print(f"The secret code is {secret_code}")
if __name__ == "__main__":
part_1()