Add solution for day 2
parent
0326b26027
commit
1469d05b2f
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,136 @@
|
|||
"""
|
||||
--- Day 2: Rock Paper Scissors ---
|
||||
|
||||
The Elves begin to set up camp on the beach. To decide whose tent gets
|
||||
to be closest to the snack storage, a giant Rock Paper Scissors
|
||||
tournament is already in progress.
|
||||
|
||||
Rock Paper Scissors is a game between two players. Each game contains
|
||||
many rounds; in each round, the players each simultaneously choose one
|
||||
of Rock, Paper, or Scissors using a hand shape. Then, a winner for that
|
||||
round is selected: Rock defeats Scissors, Scissors defeats Paper, and
|
||||
Paper defeats Rock. If both players choose the same shape, the round
|
||||
instead ends in a draw.
|
||||
|
||||
Appreciative of your help yesterday, one Elf gives you an encrypted
|
||||
strategy guide (your puzzle input) that they say will be sure to help
|
||||
you win. "The first column is what your opponent is going to play: A
|
||||
for Rock, B for Paper, and C for Scissors. The second column--"
|
||||
Suddenly, the Elf is called away to help with someone's tent.
|
||||
|
||||
The second column, you reason, must be what you should play in
|
||||
response: X for Rock, Y for Paper, and Z for Scissors. Winning every
|
||||
time would be suspicious, so the responses must have been carefully
|
||||
chosen.
|
||||
|
||||
The winner of the whole tournament is the player with the highest
|
||||
score. Your total score is the sum of your scores for each round. The
|
||||
score for a single round is the score for the shape you selected (1 for
|
||||
Rock, 2 for Paper, and 3 for Scissors) plus the score for the outcome
|
||||
of the round (0 if you lost, 3 if the round was a draw, and 6 if you
|
||||
won).
|
||||
|
||||
Since you can't be sure if the Elf is trying to help you or trick you,
|
||||
you should calculate the score you would get if you were to follow the
|
||||
strategy guide.
|
||||
|
||||
For example, suppose you were given the following strategy guide:
|
||||
|
||||
A Y
|
||||
B X
|
||||
C Z
|
||||
|
||||
This strategy guide predicts and recommends the following:
|
||||
|
||||
- In the first round, your opponent will choose Rock (A), and you
|
||||
should choose Paper (Y). This ends in a win for you with a score of 8
|
||||
(2 because you chose Paper + 6 because you won).
|
||||
- In the second round, your opponent will choose Paper (B), and you
|
||||
should choose Rock (X). This ends in a loss for you with a score of 1
|
||||
(1 + 0).
|
||||
- The third round is a draw with both players choosing Scissors, giving
|
||||
you a score of 3 + 3 = 6.
|
||||
|
||||
In this example, if you were to follow the strategy guide, you would
|
||||
get a total score of 15 (8 + 1 + 6).
|
||||
|
||||
What would your total score be if everything goes exactly according to
|
||||
your strategy guide?
|
||||
"""
|
||||
|
||||
OPPONENT_ROCK = "A"
|
||||
OPPONENT_PAPER = "B"
|
||||
OPPONENT_SCISSORS = "C"
|
||||
|
||||
LOSS = 0
|
||||
DRAW = 1
|
||||
WIN = 2
|
||||
|
||||
YOU_ROCK = "X"
|
||||
YOU_PAPER = "Y"
|
||||
YOU_SCISSORS = "Z"
|
||||
|
||||
POINTS = {
|
||||
YOU_ROCK: 1,
|
||||
YOU_PAPER: 2,
|
||||
YOU_SCISSORS: 3
|
||||
}
|
||||
|
||||
LOSS_POINTS = 0
|
||||
DRAW_POINTS = 3
|
||||
WIN_POINTS = 6
|
||||
|
||||
RESULTS = {
|
||||
f"{OPPONENT_ROCK}{YOU_ROCK}": DRAW,
|
||||
f"{OPPONENT_ROCK}{YOU_PAPER}": WIN,
|
||||
f"{OPPONENT_ROCK}{YOU_SCISSORS}": LOSS,
|
||||
f"{OPPONENT_PAPER}{YOU_ROCK}": LOSS,
|
||||
f"{OPPONENT_PAPER}{YOU_PAPER}": DRAW,
|
||||
f"{OPPONENT_PAPER}{YOU_SCISSORS}": WIN,
|
||||
f"{OPPONENT_SCISSORS}{YOU_ROCK}": WIN,
|
||||
f"{OPPONENT_SCISSORS}{YOU_PAPER}": LOSS,
|
||||
f"{OPPONENT_SCISSORS}{YOU_SCISSORS}": DRAW,
|
||||
}
|
||||
|
||||
REQUIRED_ACTIONS = {
|
||||
"X": LOSS,
|
||||
"Y": DRAW,
|
||||
"Z": WIN,
|
||||
}
|
||||
|
||||
DESIRED_RESULTS = {
|
||||
f"{OPPONENT_ROCK}X": YOU_SCISSORS,
|
||||
f"{OPPONENT_ROCK}Y": YOU_ROCK,
|
||||
f"{OPPONENT_ROCK}Z": YOU_PAPER,
|
||||
f"{OPPONENT_PAPER}X": YOU_ROCK,
|
||||
f"{OPPONENT_PAPER}Y": YOU_PAPER,
|
||||
f"{OPPONENT_PAPER}Z": YOU_SCISSORS,
|
||||
f"{OPPONENT_SCISSORS}X": YOU_PAPER,
|
||||
f"{OPPONENT_SCISSORS}Y": YOU_SCISSORS,
|
||||
f"{OPPONENT_SCISSORS}Z": YOU_ROCK,
|
||||
}
|
||||
|
||||
|
||||
def main():
|
||||
points = 0
|
||||
|
||||
with open("input.txt", "r", encoding="utf-8") as f:
|
||||
for line in f:
|
||||
if not line.strip():
|
||||
continue
|
||||
|
||||
opponent, you = line.strip().split()
|
||||
points += POINTS[you]
|
||||
action_code = f"{opponent}{you}"
|
||||
if RESULTS[action_code] == LOSS:
|
||||
points += LOSS_POINTS
|
||||
elif RESULTS[action_code] == DRAW:
|
||||
points += DRAW_POINTS
|
||||
elif RESULTS[action_code] == WIN:
|
||||
points += WIN_POINTS
|
||||
|
||||
print(f"You got {points} points")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
|
@ -0,0 +1,104 @@
|
|||
"""
|
||||
--- Part Two ---
|
||||
|
||||
The Elf finishes helping with the tent and sneaks back over to you.
|
||||
"Anyway, the second column says how the round needs to end: X means you
|
||||
need to lose, Y means you need to end the round in a draw, and Z means
|
||||
you need to win. Good luck!"
|
||||
|
||||
The total score is still calculated in the same way, but now you need to
|
||||
figure out what shape to choose so the round ends as indicated. The
|
||||
example above now goes like this:
|
||||
|
||||
- In the first round, your opponent will choose Rock (A), and you need
|
||||
the round to end in a draw (Y), so you also choose Rock. This gives
|
||||
you a score of 1 + 3 = 4.
|
||||
- In the second round, your opponent will choose Paper (B), and you
|
||||
choose Rock so you lose (X) with a score of 1 + 0 = 1.
|
||||
- In the third round, you will defeat your opponent's Scissors with
|
||||
Rock for a score of 1 + 6 = 7.
|
||||
|
||||
Now that you're correctly decrypting the ultra top secret strategy
|
||||
guide, you would get a total score of 12.
|
||||
|
||||
Following the Elf's instructions for the second column, what would your
|
||||
total score be if everything goes exactly according to your strategy
|
||||
guide?
|
||||
"""
|
||||
|
||||
OPPONENT_ROCK = "A"
|
||||
OPPONENT_PAPER = "B"
|
||||
OPPONENT_SCISSORS = "C"
|
||||
|
||||
LOSS = 0
|
||||
DRAW = 1
|
||||
WIN = 2
|
||||
|
||||
YOU_ROCK = "X"
|
||||
YOU_PAPER = "Y"
|
||||
YOU_SCISSORS = "Z"
|
||||
|
||||
POINTS = {
|
||||
YOU_ROCK: 1,
|
||||
YOU_PAPER: 2,
|
||||
YOU_SCISSORS: 3
|
||||
}
|
||||
|
||||
LOSS_POINTS = 0
|
||||
DRAW_POINTS = 3
|
||||
WIN_POINTS = 6
|
||||
|
||||
RESULTS = {
|
||||
f"{OPPONENT_ROCK}{YOU_ROCK}": DRAW,
|
||||
f"{OPPONENT_ROCK}{YOU_PAPER}": WIN,
|
||||
f"{OPPONENT_ROCK}{YOU_SCISSORS}": LOSS,
|
||||
f"{OPPONENT_PAPER}{YOU_ROCK}": LOSS,
|
||||
f"{OPPONENT_PAPER}{YOU_PAPER}": DRAW,
|
||||
f"{OPPONENT_PAPER}{YOU_SCISSORS}": WIN,
|
||||
f"{OPPONENT_SCISSORS}{YOU_ROCK}": WIN,
|
||||
f"{OPPONENT_SCISSORS}{YOU_PAPER}": LOSS,
|
||||
f"{OPPONENT_SCISSORS}{YOU_SCISSORS}": DRAW,
|
||||
}
|
||||
|
||||
REQUIRED_ACTIONS = {
|
||||
"X": LOSS,
|
||||
"Y": DRAW,
|
||||
"Z": WIN,
|
||||
}
|
||||
|
||||
DESIRED_RESULTS = {
|
||||
f"{OPPONENT_ROCK}X": YOU_SCISSORS,
|
||||
f"{OPPONENT_ROCK}Y": YOU_ROCK,
|
||||
f"{OPPONENT_ROCK}Z": YOU_PAPER,
|
||||
f"{OPPONENT_PAPER}X": YOU_ROCK,
|
||||
f"{OPPONENT_PAPER}Y": YOU_PAPER,
|
||||
f"{OPPONENT_PAPER}Z": YOU_SCISSORS,
|
||||
f"{OPPONENT_SCISSORS}X": YOU_PAPER,
|
||||
f"{OPPONENT_SCISSORS}Y": YOU_SCISSORS,
|
||||
f"{OPPONENT_SCISSORS}Z": YOU_ROCK,
|
||||
}
|
||||
|
||||
|
||||
def main():
|
||||
points = 0
|
||||
|
||||
with open("input.txt", "r", encoding="utf-8") as f:
|
||||
for line in f:
|
||||
if not line.strip():
|
||||
continue
|
||||
|
||||
opponent, desired_result = line.strip().split()
|
||||
result = REQUIRED_ACTIONS[desired_result]
|
||||
if result == DRAW:
|
||||
points += DRAW_POINTS
|
||||
elif result == WIN:
|
||||
points += WIN_POINTS
|
||||
|
||||
my_action = DESIRED_RESULTS[f"{opponent}{desired_result}"]
|
||||
points += POINTS[my_action]
|
||||
|
||||
print(f"Using the complete strategy guide, my score will be {points}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
|
@ -0,0 +1,3 @@
|
|||
A Y
|
||||
B X
|
||||
C Z
|
Loading…
Reference in New Issue