Last active
August 29, 2015 14:14
-
-
Save terrettaz/8dfe1fdbc138eab184c4 to your computer and use it in GitHub Desktop.
sqs-admin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
import csv, sys | |
from math import sin | |
from collections import Counter | |
class Player: | |
def __init__(self, name): | |
self.name = name | |
self.points = 0 | |
self.match_points = None | |
self.matchs = {True:[], False:[]} | |
self.played = Counter() | |
def gain_points(self, match_points): | |
self.match_points = match_points | |
def loose_points(self, match_points): | |
self.match_points = -match_points | |
def match_done(self, match): | |
self.matchs[self.match_points > 0].append(match) | |
self.played[match.opponent_of(self)]+=1 | |
opponent_counter = self.played[match.opponent_of(self)] | |
self.points = max(0, self.points + (self.match_points / opponent_counter)) | |
self.match_points = None | |
def __str__(self): | |
return '%s (%.2f) played %d matchs and won %d' % ( | |
self.name, | |
self.points, | |
len(self.matchs[True] + self.matchs[False]), | |
len(self.matchs[True])) | |
class Match: | |
def __init__(self, coeff_compet, player1, player2, score1, score2): | |
self.coeff_compet = coeff_compet | |
self.coeff_sets = { | |
'%dx%d' % (3,0) : 1, | |
'%dx%d' % (0,3) : 1, | |
'%dx%d' % (3,1) : 0.8, | |
'%dx%d' % (1,3) : 0.8, | |
'%dx%d' % (3,2) : 0.6, | |
'%dx%d' % (2,3) : 0.6, | |
}['%dx%d' % (score1,score2)] | |
self.players = { | |
score1 > score2: player1, | |
score1 < score2: player2} | |
def _winner_points(self): | |
return self.coeff_compet * self.coeff_sets * 4 * (sin((self._looser().points - self._winner().points)/25.46 + 1)) | |
def _winner(self): | |
return self.players[True] | |
def _looser(self): | |
return self.players[False] | |
def opponent_of(self, player): | |
return self.players[True] == player if self.players[False] else self.players[True] | |
def play(self): | |
self.players[True].gain_points(self._winner_points()) | |
self.players[False].loose_points(self._winner_points() / 2.0 ) | |
for player in self.players.itervalues(): player.match_done(self) | |
def process_csv(path): | |
players = {} | |
with open(path, 'rb') as csvfile: | |
reader = csv.DictReader(csvfile, delimiter=',') | |
for row in reader: | |
name1 = row['Player 1'] | |
name2 = row['Player 2'] | |
if name1 not in players: players[name1] = Player(name1) | |
if name2 not in players: players[name2] = Player(name2) | |
match = Match( | |
float(row['Coef compet']), | |
players[name1], | |
players[name2], | |
int(row['Score 1']), | |
int(row['Score 2'])) | |
match.play() | |
return players | |
def sqs_admin(): | |
players = process_csv(sys.argv[1]) | |
for player in sorted(players.itervalues(), key=lambda x: x.points, reverse=True): | |
print '%(player)s' % locals() | |
if __name__ == '__main__': | |
print '*********' | |
print 'SQS ADMIN' | |
print '*********' | |
sqs_admin() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment