90 lines
1.9 KiB
Python
90 lines
1.9 KiB
Python
from itertools import combinations
|
|
|
|
data = open(0).read().strip()
|
|
|
|
# hit points, damage, armor
|
|
enemy = [100, 8, 2]
|
|
|
|
weapons = [
|
|
[8, 4, 0],
|
|
[10, 5, 0],
|
|
[25, 6, 0],
|
|
[40, 7, 0],
|
|
[74, 8, 0],
|
|
]
|
|
|
|
# Armor: Cost Damage Armor
|
|
armor = [
|
|
[13, 0, 1],
|
|
[31, 0, 2],
|
|
[53, 0, 3],
|
|
[75, 0, 4],
|
|
[102, 0, 5],
|
|
]
|
|
|
|
rings = [
|
|
[25, 1, 0],
|
|
[50, 2, 0],
|
|
[100, 3, 0],
|
|
[20, 0, 1],
|
|
[40, 0, 2],
|
|
[80, 0, 3],
|
|
]
|
|
|
|
|
|
def player_configs():
|
|
for wc, wd, wa in weapons:
|
|
for ac, ad, aa in armor:
|
|
for i in range(1, 3):
|
|
for rgs in combinations(rings, i):
|
|
c = wc + ac
|
|
d = wd + ad
|
|
a = wa + aa
|
|
for rc, rd, ra in rgs:
|
|
c += rc
|
|
d += rd
|
|
a += ra
|
|
yield (c, d, a)
|
|
c = wc + ac
|
|
d = wd + ad
|
|
a = wa + aa
|
|
yield (c, d, a)
|
|
for i in range(1, 3):
|
|
for rgs in combinations(rings, i):
|
|
c = wc
|
|
d = wd
|
|
a = wa
|
|
for rc, rd, ra in rgs:
|
|
c += rc
|
|
d += rd
|
|
a += ra
|
|
yield (c, d, a)
|
|
|
|
|
|
def simulate(player, enemey):
|
|
ppoints, pdamage, parmor = player
|
|
epoints, edamage, earmor = enemey
|
|
|
|
while ppoints > 0 and epoints > 0:
|
|
epoints -= max(pdamage - earmor, 1)
|
|
ppoints -= max(edamage - parmor, 1)
|
|
|
|
if epoints <= 0:
|
|
return True
|
|
return False
|
|
|
|
|
|
part_1 = False
|
|
if part_1:
|
|
min_win = float("inf")
|
|
for c, d, a in player_configs():
|
|
if simulate([100, d, a], list(enemy)):
|
|
min_win = min(c, min_win)
|
|
print(min_win)
|
|
else:
|
|
max_loss = 0
|
|
for c, d, a in player_configs():
|
|
if not simulate([100, d, a], list(enemy)):
|
|
max_loss = max(c, max_loss)
|
|
print(max_loss)
|