careening = True
foehn = 31
atk_bonus = .1*foehn
hp_bonus = .2*careening + .1*foehn
trials = 10000
army = {
'Galley': {'n': 0, 'atk': 150, 'hp': 2000, 'fire': 0, 'chains': 0},
'Galleon': {'n': 17, 'atk': 500, 'hp': 15000, 'fire': 0, 'chains': 0},
'Fireship': {'n': 3, 'atk': 0, 'hp': 4000, 'fire': 100, 'chains': 0},
'Caravel': {'n': 0, 'atk': 200, 'hp': 6000, 'fire': 0, 'chains': 75}
}
enemies = {
'Boat': {'n': 0, 'atk': 50, 'hp': 300, 'fire': 0, 'chains': 0},
'Trireme': {'n': 116, 'atk': 200, 'hp': 3000, 'fire': 0, 'chains': 0},
'Turtle Ship': {'n': 58, 'atk': 150, 'hp': 10000, 'fire': 0, 'chains': 0},
'Blast Ship': {'n': 30, 'atk': 800, 'hp': 8000, 'fire': 0, 'chains': 0}
}
A = ['atk', 'hp', 'fire', 'chains']
enemy_totals = {}
for a in A: enemy_totals[a] = 0
for unit in enemies:
for a in A: enemy_totals[a] += enemies[unit]['n'] * enemies[unit][a]
army_totals = {}
for a in A: army_totals[a] = 0
for unit in army:
for a in A: army_totals[a] += army[unit]['n'] * army[unit][a]
from numpy.random import rand
def randomize(n): return n * (1 + .25 * (rand() - rand()))
def fight(d):
my_hp = army_totals['hp'] * (1+hp_bonus)
enemy_hp = enemy_totals['hp']
fire, chains = 0, 0
i = 0
while enemy_hp > 0 and i < 50:
i += 1
chains += randomize(army_totals['chains'])
fire += randomize(army_totals['fire'])
atk = randomize(army_totals['atk'])
my_dmg = (fire + atk)*(1+atk_bonus)
enemy_dmg = max(randomize(enemy_totals['atk']) - chains, 0)
enemy_hp -= my_dmg
my_hp -= enemy_dmg
return my_hp > 0
print sum(map(fight, range(trials))), "/", trials
Y2FyZWVuaW5nID0gVHJ1ZQpmb2VobiA9IDMxCgphdGtfYm9udXMgPSAuMSpmb2VobgpocF9ib251cyA9IC4yKmNhcmVlbmluZyArIC4xKmZvZWhuCgp0cmlhbHMgPSAxMDAwMAoKYXJteSA9IHsKICAnR2FsbGV5JzogICB7J24nOiAgIDAsICdhdGsnOiAxNTAsICdocCc6ICAyMDAwLCAnZmlyZSc6ICAgMCwgJ2NoYWlucyc6ICAgMH0sCiAgJ0dhbGxlb24nOiAgeyduJzogICAxNywgJ2F0ayc6IDUwMCwgJ2hwJzogMTUwMDAsICdmaXJlJzogICAwLCAnY2hhaW5zJzogICAwfSwKICAnRmlyZXNoaXAnOiB7J24nOiAgIDMsICdhdGsnOiAgIDAsICdocCc6ICA0MDAwLCAnZmlyZSc6IDEwMCwgJ2NoYWlucyc6ICAgMH0sCiAgJ0NhcmF2ZWwnOiAgeyduJzogICAwLCAnYXRrJzogMjAwLCAnaHAnOiAgNjAwMCwgJ2ZpcmUnOiAgIDAsICdjaGFpbnMnOiAgNzV9Cn0KZW5lbWllcyA9IHsKICAnQm9hdCc6ICAgICAgICB7J24nOiAwLCAnYXRrJzogICA1MCwgJ2hwJzogICAzMDAsICdmaXJlJzogMCwgJ2NoYWlucyc6IDB9LAogICdUcmlyZW1lJzogICAgIHsnbic6IDExNiwgJ2F0ayc6ICAyMDAsICdocCc6ICAzMDAwLCAnZmlyZSc6IDAsICdjaGFpbnMnOiAwfSwKICAnVHVydGxlIFNoaXAnOiB7J24nOiA1OCwgJ2F0ayc6ICAxNTAsICdocCc6IDEwMDAwLCAnZmlyZSc6IDAsICdjaGFpbnMnOiAwfSwKICAnQmxhc3QgU2hpcCc6ICB7J24nOiAzMCwgJ2F0ayc6ICA4MDAsICdocCc6ICA4MDAwLCAnZmlyZSc6IDAsICdjaGFpbnMnOiAwfQp9CgpBID0gWydhdGsnLCAnaHAnLCAnZmlyZScsICdjaGFpbnMnXQplbmVteV90b3RhbHMgPSB7fQpmb3IgYSBpbiBBOiBlbmVteV90b3RhbHNbYV0gPSAwCmZvciB1bml0IGluIGVuZW1pZXM6CiAgZm9yIGEgaW4gQTogZW5lbXlfdG90YWxzW2FdICs9IGVuZW1pZXNbdW5pdF1bJ24nXSAqIGVuZW1pZXNbdW5pdF1bYV0KCmFybXlfdG90YWxzID0ge30KZm9yIGEgaW4gQTogYXJteV90b3RhbHNbYV0gPSAwCmZvciB1bml0IGluIGFybXk6CiAgZm9yIGEgaW4gQTogYXJteV90b3RhbHNbYV0gKz0gYXJteVt1bml0XVsnbiddICogYXJteVt1bml0XVthXQoKZnJvbSBudW1weS5yYW5kb20gaW1wb3J0IHJhbmQKZGVmIHJhbmRvbWl6ZShuKTogcmV0dXJuIG4gKiAoMSArIC4yNSAqIChyYW5kKCkgLSByYW5kKCkpKQpkZWYgZmlnaHQoZCk6CiAgbXlfaHAgPSBhcm15X3RvdGFsc1snaHAnXSAqICgxK2hwX2JvbnVzKQogIGVuZW15X2hwID0gZW5lbXlfdG90YWxzWydocCddCiAgZmlyZSwgY2hhaW5zID0gMCwgMAogIGkgPSAwCiAgd2hpbGUgZW5lbXlfaHAgPiAwIGFuZCBpIDwgNTA6CiAgICBpICs9IDEKICAgIGNoYWlucyArPSByYW5kb21pemUoYXJteV90b3RhbHNbJ2NoYWlucyddKQogICAgZmlyZSArPSByYW5kb21pemUoYXJteV90b3RhbHNbJ2ZpcmUnXSkKICAgIGF0ayA9IHJhbmRvbWl6ZShhcm15X3RvdGFsc1snYXRrJ10pCiAgICBteV9kbWcgPSAoZmlyZSArIGF0aykqKDErYXRrX2JvbnVzKQogICAgZW5lbXlfZG1nID0gbWF4KHJhbmRvbWl6ZShlbmVteV90b3RhbHNbJ2F0ayddKSAtIGNoYWlucywgMCkKICAgIGVuZW15X2hwIC09IG15X2RtZwogICAgbXlfaHAgLT0gZW5lbXlfZG1nCiAgcmV0dXJuIG15X2hwID4gMApwcmludCBzdW0obWFwKGZpZ2h0LCByYW5nZSh0cmlhbHMpKSksICIvIiwgdHJpYWxzIA==