gostyle: the basic library, intitial commit.
[gostyle.git] / utils / rank.py
blob10b2050a7e95afdd1e8564392e5b07233a28243c
1 from sqlalchemy import types
2 from time import mktime
3 from datetime import datetime
4 import re
6 import misc
8 class RankInitExc(Exception):
9 pass
11 class Rank:
12 KEYS={'k': lambda x: x, # 1kyu -> 1, 30kyu -> 30
13 'd': lambda x: -x + 1, # 1dan -> 0, 10dan -> -9
14 'p': lambda x: -x - 9} # 1pro -> -10, 10pro -> -19
16 DOMAIN_MAX = { 'k' : 30,
17 'd' : 10,
18 'p' : 10 }
20 @staticmethod
21 def from_key(number):
22 ranks = list(Rank.iter_all())
23 dists = [ abs(number - r.key()) for r in ranks ]
24 return misc.argmin( zip(ranks, dists) )
26 @staticmethod
27 def from_string(string):
28 mo = re.match('^([1-9][0-9]?) ?([kdp]).*', string)
29 if not mo:
30 return None
31 try:
32 return Rank(int(mo.group(1)), mo.group(2))
33 except (ValueError, RankInitExc):
34 return None
36 @staticmethod
37 def iter_all():
38 for key, domain in Rank.DOMAIN_MAX.iteritems():
39 for x in xrange(domain):
40 yield Rank( x + 1, key )
42 def __init__(self, number, kdp):
43 self.number, self.kdp = number, kdp
45 if not self.kdp in self.KEYS:
46 raise RankInitExc("kdp must be either 'k' for kyu players,"
47 " 'd' for dan players or 'p' for proffesionals")
49 def check_domain(bottom, val, up):
50 assert bottom <= up
51 if not( bottom <= val <= up):
52 raise RankInitExc("Must be %d <= %d <= %d.")
54 check_domain(1, self.number, self.DOMAIN_MAX[self.kdp])
56 def as_tuple(self):
57 return self.number, self.kdp
59 def key(self):
60 return self.KEYS[self.kdp](self.number)
62 def __str__(self):
63 return "%d%s"%(self.number, self.kdp)
65 def __repr__(self):
66 return "Rank(%s, key=%d)"%(self, self.key())
68 def __hash__(self):
69 return self.key().__hash__()
71 def __cmp__(self, other):
72 if not isinstance(other, Rank):
73 return -1
74 return ( - self.key()).__cmp__( - other.key())
77 if __name__ == "__main__":
79 assert Rank(6, 'd') > Rank(2, 'd') > Rank(1, 'k') > Rank(10, 'k')
81 def print_rank():
82 print "["
83 for rank in Rank.iter_all():
84 value = rank.key()
85 text = str(rank)
86 print '{"value" : "%s", "text" : "%s"},' % (value, text)
87 print "]"
89 print_rank()