Script Calcolo ELO

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.

Comments are closed.