101 lines
2.6 KiB
Python
101 lines
2.6 KiB
Python
|
|
import re
|
||
|
|
from itertools import product
|
||
|
|
from math import inf
|
||
|
|
|
||
|
|
from solutions import BaseSolution
|
||
|
|
|
||
|
|
SHOP = [
|
||
|
|
[
|
||
|
|
("Dagger", 8, 4, 0),
|
||
|
|
("Shortsword", 10, 5, 0),
|
||
|
|
("Warhammer", 25, 6, 0),
|
||
|
|
("Longsword", 40, 7, 0),
|
||
|
|
("Greataxe", 74, 8, 0),
|
||
|
|
],
|
||
|
|
[
|
||
|
|
("No armor", 0, 0, 0),
|
||
|
|
("Leather", 13, 0, 1),
|
||
|
|
("Chainmail", 31, 0, 2),
|
||
|
|
("Splintmail", 53, 0, 3),
|
||
|
|
("Bandedmail", 75, 0, 4),
|
||
|
|
("Platemail", 102, 0, 5),
|
||
|
|
],
|
||
|
|
[
|
||
|
|
("No ring", 0, 0, 0),
|
||
|
|
("Damage +1", 25, 1, 0),
|
||
|
|
("Damage +2", 50, 2, 0),
|
||
|
|
("Damage +3", 100, 3, 0),
|
||
|
|
("Defense +1", 20, 0, 1),
|
||
|
|
("Defense +2", 40, 0, 2),
|
||
|
|
("Defense +3", 80, 0, 3),
|
||
|
|
("Damage +1 & Damage +2", 75, 3, 0),
|
||
|
|
("Damage +1 & Damage +3", 125, 4, 0),
|
||
|
|
("Damage +1 & Defense +1", 45, 1, 1),
|
||
|
|
("Damage +1 & Defense +2", 65, 1, 2),
|
||
|
|
("Damage +1 & Defense +3", 105, 1, 3),
|
||
|
|
("Damage +2 & Damage +3", 150, 5, 0),
|
||
|
|
("Damage +2 & Defense +1", 70, 2, 1),
|
||
|
|
("Damage +2 & Defense +2", 90, 2, 2),
|
||
|
|
("Damage +2 & Defense +3", 130, 2, 3),
|
||
|
|
("Damage +3 & Defense +1", 120, 3, 1),
|
||
|
|
("Damage +3 & Defense +2", 140, 3, 2),
|
||
|
|
("Damage +3 & Defense +3", 180, 3, 3),
|
||
|
|
("Defense +1 & Defense +2", 60, 0, 3),
|
||
|
|
("Defense +1 & Defense +3", 100, 0, 4),
|
||
|
|
("Defense +2 & Defense +3", 120, 0, 5),
|
||
|
|
],
|
||
|
|
]
|
||
|
|
|
||
|
|
|
||
|
|
class Solution(BaseSolution):
|
||
|
|
input_file = "21.txt"
|
||
|
|
|
||
|
|
def __str__(self):
|
||
|
|
return "Day 21: RPG Simulator 20XX"
|
||
|
|
|
||
|
|
def solve(self, pi):
|
||
|
|
o = self._solve(pi)
|
||
|
|
return o[0]
|
||
|
|
|
||
|
|
def solve_again(self, pi):
|
||
|
|
o = self._solve(pi)
|
||
|
|
return o[1]
|
||
|
|
|
||
|
|
def parse_input(self, data):
|
||
|
|
return data.strip()
|
||
|
|
|
||
|
|
def _solve(self, pi):
|
||
|
|
boss = re.findall(r"\d+", pi)
|
||
|
|
l = inf
|
||
|
|
m = 0
|
||
|
|
for ph, pd, pa, c in self._gearup():
|
||
|
|
bh, bd, ba = [int(v) for v in boss]
|
||
|
|
while bh > 0 and ph > 0:
|
||
|
|
bh -= max(1, pd - ba)
|
||
|
|
if bh <= 0:
|
||
|
|
break
|
||
|
|
ph -= max(1, bd - pa)
|
||
|
|
if ph > 0:
|
||
|
|
l = min(l, c)
|
||
|
|
else:
|
||
|
|
m = max(m, c)
|
||
|
|
return l, m
|
||
|
|
|
||
|
|
def _gearup(self):
|
||
|
|
g = []
|
||
|
|
for w, a, r in product(*SHOP):
|
||
|
|
g.append(
|
||
|
|
(
|
||
|
|
100,
|
||
|
|
sum([w[2], a[2], r[2]]),
|
||
|
|
sum([w[3], a[3], r[3]]),
|
||
|
|
sum([w[1], a[1], r[1]]),
|
||
|
|
)
|
||
|
|
)
|
||
|
|
return g
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
solution = Solution()
|
||
|
|
solution.show_results()
|