Skip to content

Instantly share code, notes, and snippets.

@terrettaz
Last active August 29, 2015 14:14
Show Gist options
  • Save terrettaz/8dfe1fdbc138eab184c4 to your computer and use it in GitHub Desktop.
Save terrettaz/8dfe1fdbc138eab184c4 to your computer and use it in GitHub Desktop.
sqs-admin
#!/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