Files
@ d908ea134adb
Branch filter:
Location: Rank-Progress/rank_progress.py - annotation
d908ea134adb
3.3 KiB
text/x-python
a RankTracker class
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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | ddeb551e1404 ddeb551e1404 ddeb551e1404 ddeb551e1404 ddeb551e1404 ddeb551e1404 3d0ab62fd174 3d0ab62fd174 2156c5a17dfe 2156c5a17dfe 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 2156c5a17dfe 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 3d0ab62fd174 2156c5a17dfe 2156c5a17dfe 3d0ab62fd174 3d0ab62fd174 d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb ddeb551e1404 ddeb551e1404 ddeb551e1404 ddeb551e1404 ddeb551e1404 ddeb551e1404 ddeb551e1404 ddeb551e1404 ddeb551e1404 ddeb551e1404 2156c5a17dfe 2156c5a17dfe 2156c5a17dfe 2156c5a17dfe 2156c5a17dfe 2156c5a17dfe d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb ddeb551e1404 d908ea134adb d908ea134adb d908ea134adb d908ea134adb ddeb551e1404 d908ea134adb d908ea134adb ddeb551e1404 d908ea134adb d908ea134adb d908ea134adb d908ea134adb ddeb551e1404 d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb ddeb551e1404 d908ea134adb d908ea134adb d908ea134adb d908ea134adb d908ea134adb dfc18f1d128e d908ea134adb d908ea134adb ddeb551e1404 d908ea134adb d908ea134adb d908ea134adb d908ea134adb | import re
from itertools import groupby
from datetime import datetime
import argparse
class Record:
def __init__(self, tokens, source):
self.source = source
self.pin = int(tokens[0])
self.country_code = tokens[2]
self.rating_before = int(tokens[8])
self.rounded_before = round_rating(self.rating_before)
self.rating_after = int(tokens[9])
self.rounded_after = round_rating(self.rating_after)
tournament_code = tokens[5]
self.date = datetime.strptime(tournament_code[1:7], "%y%m%d")
self.rank_change = (rating_to_rank(self.rating_before), rating_to_rank(self.rating_after))
@classmethod
def parse(cls, line):
tokens = re.split(r" {2,}", line.strip())
if len(tokens) != 10:
return None
return cls(tokens, line)
def __str__(self):
s = self.source + " {} -> {}".format(*self.rank_change)
return s
class RankTracker:
def __init__(self, rating):
self._rounded_rating = round_rating(rating)
@property
def rank(self):
return rating_to_rank(self._rounded_rating)
def update(self, rating):
rounded_rating = round_rating(rating)
if rounded_rating == self._rounded_rating:
return False
elif rounded_rating > self._rounded_rating: # promotion
self._rounded_rating = rounded_rating
return self.rank
else: # demotion
if rounded_rating >= 1500 and self._rounded_rating - rating > 100:
self._rounded_rating = rounded_rating
return self.rank
elif self._rounded_rating - rating > 150:
self._rounded_rating = rounded_rating+100
return self.rank
else:
return False
def parse_record(record):
types = [int, str, str, str, str, str, int, int, int, int]
columns = [f(token) for (f, token) in zip(types, record)] + [datetime.strptime(record[5][1:7], "%y%m%d")]
return tuple(columns)
def round_rating(r):
return (r+50)//100*100
def rating_to_rank(rating):
rank_list = [str(i)+"k" for i in range(30, 0, -1)] + [str(i)+"d" for i in range(1, 8)]
key = round_rating(rating)//100
return rank_list[min(key+9, 36)]
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("since", help="a date in YYYYMMDD format")
parser.add_argument("to", nargs="?", help="a date in YYYYMMDD format")
parser.add_argument("-c", "--country-code", default="CZ", help="a two letter country code, default=CZ")
args = parser.parse_args()
since = datetime.strptime(args.since, "%Y%m%d")
to = datetime.strptime(args.to, "%Y%m%d") if args.to else datetime.now()
with open("/tmp/all.hst") as f:
s = f.read()
records = [Record.parse(line) for line in s.splitlines()]
records = filter(lambda rec: rec is not None, records)
national_records = filter(lambda rec: rec.country_code == args.country_code, records)
player_records = groupby(national_records, lambda rec: rec.pin)
for (pin, recs) in player_records:
tourneys = list(recs)
rounded_rating = tourneys[0].rounded_before
steps = []
for r in tourneys:
# omit reset ratings
if rounded_rating != r.rounded_before:
rounded_rating = r.rounded_before
if r.rating_after-rounded_rating >= 50 or \
(rounded_rating-r.rating_after > 100 and rounded_rating >= 1600):
steps.append(r)
rounded_rating = r.rounded_after
elif rounded_rating-r.rating_after > 150:
steps.append(r)
rounded_rating = r.rounded_after + 100
steps = [r for r in steps if since <= r.date <= to]
if steps:
print("\n".join(map(str, steps)))
print()
|