71 lines
1.4 KiB
Python
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
|