-
Notifications
You must be signed in to change notification settings - Fork 0
/
cmd_check.py
100 lines (88 loc) · 2.94 KB
/
cmd_check.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import re, csv
# based on the databases pulled from d20pfsrd.com
MONSTER_DB = "inputs/monster_bestiary_partial.csv"
NPC_DB = "inputs/monster_stat_blocks_full.csv"
def get_cmd(filename):
hit_d = {}
cmd_d = {}
with open(filename) as f:
reader = csv.reader(f)
headers = reader.next()
print headers
Name_header = headers.index("Name")
CR_header = headers.index("CR")
Melee_header = headers.index("Melee")
CMD_header = headers.index("FullText")
hit_reg = ".((\+|\-)?\d+)"
cmd_reg = "<b>CMD </b>(\<i\>)?(\+?\d+|\-)"
for items in reader:
if items[Melee_header]:
m = re.search(hit_reg, items[Melee_header])
try:
## print "{0}|{1}|{2}".format(items[Name_header],
## items[Melee_header],
## m.group(1))
hit = int(m.group(1))
a = hit_d.get(items[CR_header], [])
if a == None:
print hit_d
return
a.append(hit)
hit_d[items[CR_header]] = a
except Exception as e:
print "Hit:",items[Name_header],e
print "\t",items[Melee_header]
## print m.groups()
## return
m = re.search(cmd_reg, items[CMD_header])
try:
if m.group(2) != '-':
cmd = int(m.group(2))
a = cmd_d.get(items[CR_header], [])
if a == None:
print cmd_d
return
a.append(cmd)
cmd_d[items[CR_header]] = a
except Exception as e:
print "CMD:",items[Name_header],e
return hit_d, cmd_d
def mean(l):
return float(sum(l))/len(l)
def median(numericValues):
theValues = sorted(numericValues)
if len(theValues) % 2 == 1:
return theValues[(len(theValues)+1)/2-1]
else:
lower = theValues[len(theValues)/2-1]
upper = theValues[len(theValues)/2]
return (float(lower + upper)) / 2
def mode(alist):
mode = None
mode_count = 0
no_dups = list(set(alist))
for i in no_dups:
## print i,alist.count(i)," ",
if alist.count(i) > mode_count:
mode = i
mode_count = alist.count(i)
## print ""
return mode, mode_count, "{0:.1%}".format(float(mode_count)/len(alist))
def stddev(l, m=None):
if not m:
m = mean(l)
stddev_l = [(m-n)**2 for n in l]
return mean(stddev_l)**0.5
def print_avgs(d):
keys = sorted(d.keys())
for k in keys:
print "{0}\t{1}\t{2}".format(k, mean(d[k]), stddev(d[k]))
hit_d, cmd_d = get_cmd(MONSTER_DB)
print hit_d
print cmd_d
print ""
print "To hit:"
print_avgs(hit_d)
print ""
print "CMD:"
print_avgs(cmd_d)