Dato che ho ripreso un po il pallino degli scacchi riporto di seguito uno script python di 60 righe non troppo elaborato (mancano infatti tutte le gestioni delle eccezioni) per il calcolo e aggiornamento del punteggio ELO.
L’uso è semplice e si riduce a:
python elo.py <elo_attuale> <score> <elo_avversario1> ….. <elo_avversarioN>
Per i sistemi Unix come al solito su può tralasciare il “python” iniziale.
#! /usr/bin/env python
# Calcolatore per ELO
import sys
#Costanti per estrarre i dati dal risultato di Start.
OLD_ELO = 0
EXPECTED_SCORES = 1
EFFECTIVE_SCORE = 2
NEW_ELO = 3
#Impostazioni.
SEP = 60
def punteggioAtteso(diff) :
return 1.0 / ( 1.0 + (10.0 ** ( float(diff) / 400.0 ) ) )
def newElo(elo, patteso, peffettivo, K) :
return elo + int (K * (peffettivo - patteso) )
def start(arg) :
lista_attesi = []
myElo = int(arg[0])
if myElo < 2100 :
K = 32
elif 2100<=myElo<=2400 :
K = 24
else :
K = 16
peffettivo = float(arg[1])
avversari = arg[2:]
patteso = 0
for i in avversari :
current_atteso = punteggioAtteso( int(i) - myElo )
lista_attesi.append(current_atteso)
patteso += current_atteso
return (myElo, lista_attesi , peffettivo, newElo(myElo,patteso,peffettivo,K) )
def printResult(result) :
myElo = result[0]
lista_attesi = result[1]
peffettivo = result[2]
nelo = result[3]
print "Your current ELO is: %i" % myElo
print '-'*SEP
somma = 0.0
for i in lista_attesi :
print "\tExpected score #%2i: %f" % (lista_attesi.index(i) + 1 , i)
somma += i
print '-'*SEP
print "\tExpected total score : %f" % somma
print "\tEffective total score: %f" % peffettivo
print '-'*SEP
print "Your new ELO is: %i" % nelo
print "Change: %i%%" % int( ((nelo - myElo) * 100.0) / myElo)
print '-'*SEP
if __name__ == "__main__" :
arg = sys.argv[1:]
result = start(arg)
printResult(result)
Allegherò in seguito un file commentato.