Solution to problem 2 part 1 in Python
This commit is contained in:
parent
f1455f696d
commit
c1e70b921c
121
src/Year_2016/P2.py
Normal file
121
src/Year_2016/P2.py
Normal 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()
|
Loading…
Reference in New Issue
Block a user