I have recently started playing clickerheroes again. In the recent patch they introduced a new mechanic to mercenaries: their lifetime. Instead of having a random chance at dying now they have a certain lifespan given by a geometric distribution of p = 0.2. They can be sent on quests to accumulate a premium currency called rubys. When they die you can revive them paying rubys.
The amount of rewards they bring home are scaling linear with their level, while the revivecost is scaling exponentially, so at a certain level it is better to not revive a mercenary and instead hire a new one.
I wrote some code simulating this challenge but found that it was pretty long and there certainly must be a way to make it shorter.
Your job is to do that and find the level where not reviving makes the ruby return per day reach a maximum.
More information on mercenaries
The lifespan of a mercenary is given by a geometric distribution with p = 0.2 in days. Within the day the distribution is linear. Meaning that the chance to die at any given minute is the same as any other minute that day.
Doing a quest reduces the lifespan by the duration of that quest.
You can always choose from 4 quests.
The quest available are random and split in 2 parts.
The main objective is choosen from a pool of 5 where only 1 is finding rubies so the chance that it is a ruby quest is 1/5.
The other value is the duration, the possibilities are 5 min, 15 min, 30 min, 1 hour, 2 hours, 4 hours, 8 hours, 1 day and 2 days.
The reward is given by the base value 0.01112 rubies times the level times the duration/5min (eg 30 min = 6) times a durations factor, since longer quest gives diminishing returns, given in the table below.
5 min 1 15 min 0.8594 30 min 0.7785 1 hour 0.624 2 hours 0.5467 4 hours 0.4687 8 hours 0.3903 1 day 0.3125 2 days 0.25
This means we will always choose the shortest ruby quest and if there isn´t one the shortest other quest.
The cost to revive a mercenary is
10 + ceiling(1.5^level)
After reviving the quest is finished and then a new lifespan is generated
The level is going up by 1 for every day the mercenary spent questing and it starts at 1.
Input and Result
This program should require no input. In the case that your language is not able to generate values of a geometric distribution you may take random values from this list.
The result is a single number that represents at what point a mercenay should be discarded instead of revived.
The precision requirement is not a fixed value like 10%, but instead the accuracy should increase the more repetitions you run, so a perfect value should be theoretically possible given unlimited computation power.
The result of my simulation looks like this:
I used 50000 mercenarys per revive cap. Below 10000 gives spiky bits due to randomness