Files @ 6644c5267fb5
Branch filter:

Location: Rank-Progress/rank_progress.py - annotation

Laman
added tests
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
6644c5267fb5
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
6644c5267fb5
d908ea134adb
6644c5267fb5
d908ea134adb
d908ea134adb
6644c5267fb5
d908ea134adb
d908ea134adb
d908ea134adb
6644c5267fb5
d908ea134adb
d908ea134adb
d908ea134adb
d908ea134adb
6644c5267fb5
6644c5267fb5
6644c5267fb5
6644c5267fb5
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):
		assert rating >= -900
		self._rounded_rating = round_rating(rating)

	@property
	def rank(self):
		return rating_to_rank(self._rounded_rating)

	def update(self, rating):
		assert rating >= -900
		rounded_rating = round_rating(rating)
		old_rank = self.rank

		if rounded_rating == self._rounded_rating:
			pass
		elif rounded_rating > self._rounded_rating:  # promotion
			self._rounded_rating = rounded_rating
		else:  # demotion
			if self._rounded_rating >= 1600 and self._rounded_rating - rating > 100:
				self._rounded_rating = rounded_rating
			elif self._rounded_rating - rating > 150:
				self._rounded_rating = rounded_rating+100
			else:
				pass

		new_rank = self.rank
		return new_rank if new_rank != old_rank else 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()