82 lines
1.4 KiB
Python
82 lines
1.4 KiB
Python
from pathlib import Path
|
|
|
|
WINS_OVER = {
|
|
"A": "C",
|
|
"B": "A",
|
|
"C": "B",
|
|
"X": "C",
|
|
"Y": "A",
|
|
"Z": "B",
|
|
}
|
|
|
|
|
|
BASE_SCORE = {
|
|
"A": 1,
|
|
"B": 2,
|
|
"C": 3,
|
|
"X": 1,
|
|
"Y": 2,
|
|
"Z": 3,
|
|
}
|
|
|
|
|
|
def score(a: str, b: str) -> int:
|
|
result = BASE_SCORE.get(b)
|
|
|
|
if BASE_SCORE[a] == BASE_SCORE[b]:
|
|
# Draw
|
|
result += 3
|
|
elif a == WINS_OVER[b]:
|
|
# Win
|
|
result += 6
|
|
|
|
return result
|
|
|
|
|
|
def winning_shape(other: str, goal: str) -> str:
|
|
if goal == "Y":
|
|
# Draw
|
|
return other
|
|
|
|
if goal == "X":
|
|
# Win
|
|
return WINS_OVER[other]
|
|
|
|
if goal == "Z":
|
|
# Lose
|
|
return next(k for k, v in WINS_OVER.items() if v == other)
|
|
|
|
|
|
# Setup
|
|
|
|
# Example data
|
|
# data = """
|
|
# A Y
|
|
# B X
|
|
# C Z
|
|
# """
|
|
|
|
data = (Path(__file__).parents[1] / "input").read_text()
|
|
|
|
# Problem solving - part 1
|
|
scores = [
|
|
score(*parts) for line in data.splitlines() if (parts := line.split(maxsplit=1))
|
|
]
|
|
|
|
total = sum(scores)
|
|
print(total)
|
|
|
|
# Problem solving - part 2
|
|
assert winning_shape("B", "Z") == "C" # Win against paper -> scissors
|
|
assert winning_shape("B", "Y") == "B" # Draw against paper -> paper
|
|
assert winning_shape("B", "X") == "A" # Lose against paper -> rock
|
|
|
|
scores = [
|
|
score(parts[0], winning_shape(parts[0], parts[1]))
|
|
for line in data.splitlines()
|
|
if (parts := line.split(maxsplit=1))
|
|
]
|
|
|
|
total = sum(scores)
|
|
print(total)
|