Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

77 linhas
2.3KB

  1. from collections import namedtuple
  2. import itertools
  3. def play(spell, state):
  4. is_win = 0
  5. hp, mp, boss_hp, boss_dmg, turns, mp_spent, is_hard = state
  6. for turn in (spell, None):
  7. # prelude
  8. if turn is not None and is_hard:
  9. hp -= 1
  10. if hp <= 0:
  11. is_win = -1
  12. break
  13. if 'r' in turns[-5:]:
  14. mp += 101
  15. if 'p' in turns[-6:]:
  16. boss_hp -= 3
  17. if boss_hp <= 0:
  18. is_win = 1
  19. break
  20. # action
  21. if turn == 'm':
  22. mp_spent += 53
  23. boss_hp -= 4
  24. elif turn == 'd':
  25. mp_spent += 73
  26. boss_hp -= 2
  27. hp += 2
  28. elif turn == 's':
  29. mp_spent += 113
  30. if 's' in turns[-5:]:
  31. is_win = -1
  32. break
  33. elif turn == 'p':
  34. mp_spent += 173
  35. if 'p' in turns[-5:]:
  36. is_win = -1
  37. break
  38. elif turn == 'r':
  39. mp_spent += 229
  40. if 'r' in turns[-4:]:
  41. is_win = -1
  42. break
  43. elif turn == None:
  44. hp -= max(boss_dmg - 7 if 's' in turns[-6:] else boss_dmg, 1)
  45. turns += (turn,)
  46. # denouement
  47. if mp_spent > mp:
  48. is_win = -1
  49. break
  50. if boss_hp <= 0:
  51. is_win = 1
  52. break
  53. if hp <= 0:
  54. is_win = -1
  55. break
  56. return is_win, State(hp, mp, boss_hp, boss_dmg, turns, mp_spent, is_hard)
  57. State = namedtuple('State', 'hp,mp,boss_hp,boss_dmg,turns,mp_spent,is_hard')
  58. boss_hp, boss_dmg = map(int, re.findall(r'\d+', text))
  59. pending, wins = [State(50, 500, boss_hp, boss_dmg, tuple(), 0, False)], set()
  60. while not wins:
  61. outcomes = [play(spell, state) for state in pending for spell in 'mdspr']
  62. wins |= {state for is_win, state in outcomes if is_win == 1}
  63. pending = [state for is_win, state in outcomes if is_win == 0]
  64. ans1 = min(win.mp_spent for win in wins)
  65. pending, wins = [State(50, 500, boss_hp, boss_dmg, tuple(), 0, True)], set()
  66. while not wins:
  67. outcomes = [play(spell, state) for state in pending for spell in 'mdspr']
  68. wins |= {state for is_win, state in outcomes if is_win == 1}
  69. pending = [state for is_win, state in outcomes if is_win == 0]
  70. ans2 = min(win.mp_spent for win in wins)