adventOfCode/challenges/2022/02-rockPaperScissors/py/__init__.py
2022-12-02 10:24:39 +00:00

71 lines
1.4 KiB
Python

from typing import *
from aocpy import BaseChallenge
Match = List[str]
ROCK = "A"
PAPER = "B"
SCISSORS = "C"
LOSE = "X"
DRAW = "Y"
WIN = "Z"
SCORES = {
ROCK: 1,
PAPER: 2,
SCISSORS: 3,
WIN: 6,
LOSE: 0,
DRAW: 3,
}
MAGIC_BEANS = [SCISSORS, ROCK, PAPER, SCISSORS, ROCK]
OUTCOME_OFFSETS = {
WIN: 1,
LOSE: -1,
DRAW: 0,
}
def parse(instr: str) -> List[Match]:
return [x.split(" ") for x in instr.strip().splitlines()]
class Challenge(BaseChallenge):
@staticmethod
def one(instr: str) -> int:
inp = parse(instr)
for i, m in enumerate(inp):
m[1] = m[1].replace("X", ROCK).replace("Y", PAPER).replace("Z", SCISSORS)
inp[i] = m
score = 0
for m in inp:
score += SCORES[m[1]]
if m[0] == m[1]:
score += SCORES[DRAW]
else:
opponent = MAGIC_BEANS.index(m[1], 1)
ours = MAGIC_BEANS.index(m[0], opponent - 1, opponent + 2)
if opponent - ours == OUTCOME_OFFSETS[WIN]:
score += SCORES[WIN]
return score
@staticmethod
def two(instr: str) -> int:
inp = parse(instr)
score = 0
for m in inp:
score += SCORES[m[1]]
our_move = MAGIC_BEANS[MAGIC_BEANS.index(m[0], 1) + OUTCOME_OFFSETS[m[1]]]
score += SCORES[our_move]
return score