Newsgroup: it.hobby.scacchi
Titolo: [ATOM] - Another TOurnament Manager

[ATOM] - Another TOurnament Manager
Invio questo messaggio per presentare la posa ufficiale della prima
pietra del programma di gestione tornei di scacchi, open source e
portabile su qualunque piattaforma.
Come nome ho scelto ATOM, o meglio A.TO.M., semplice da ricordare, che
ispira una certa solidita' intrinseca, ma che soprattutto, seguendo la
radicata consuetudine degli acronimi in stile unix, presenta se stesso
come "un altro programma di gestione tornei".
Another TOurnament Manager.
Non vuole essere l'unico ne' pretende di diventarlo.
Vuole essere semplicemente uno dei tanti, con qualche caratteristica che
lo contraddistingue.
La prima pietra del programma, o meglio, le sue fondamenta, e' un file
in formato XML che contiene tutti i dati necessari all'elaborazione del
turno seguente.
Perche' XML?
Perche' e' un formato ormai consolidato, perche' e' facile da leggere
con qualunque linguaggio dotato di apposita libreria, perche' e'
facilmente intelligibile anche dall'operatore che, per qualunque
necessita' debba smanacciarvi dentro con un editor.
Inoltre non e' un formato per nulla rigido: e' possibile aggiungere o
togliere campi e record senza modificare il codice che lo deve leggere.
Riporto la struttura minima del file qui di seguito, che un esempio vale
piu' di 1000 parole:
<?xml version="1.0" ?>
<atom ver="0.1">
  <tournament name="25' International Chess Tournament 2005 - Open A"
rounds="9">
    <points win="1" draw="0.5" lose="0" />
    <titles>
      <GM id="1" />
      <IM id="2" />
      <FM id="3" />
      <M id="4" />
    </titles>
  </tournament>
  <player_list>
    <player id="110" rating="2048" title="CM" name="AGLIETTI Graziano"
/>
    <player id="108" rating="2055" title="CM" name="AGNELLI Francesco"
/>
    <player id="84" rating="2108" title="CM" name="ALBERTON Roberto" />
    <player id="64" rating="2154" title="CM" name="ANDREOLI Renato" />
    <player id="73" rating="2129" title="-M" name="ASTENGO Corrado" />
    <player id="42" rating="2308" title="FM" name="Ardaman Miles" />
    <player id="6" rating="2561" title="GM" name="Atalik Suat" />
    <player id="62" rating="2165" title="CM" name="BALDAZZI Stefano" />
    <player id="75" rating="2126" title="CM" name="BARTOLOZZI Roberto"
/>
    <player id="26" rating="2375" title="IM" name="BELLIA Fabrizio" />
    <player id="52" rating="2225" title="-M" name="BENTIVEGNA Francesco"
/>
    <player id="122" rating="2002" title="CM" name="BERTAGIA Roldano" />
    ...
    <player id="120" rating="2008" title="CM" name="VIRZI Ettore" />
    <player id="28" rating="2372" title="FM" name="VOCATURO Daniele" />
    <player id="96" rating="2087" title="CM" name="ZANELLATO Lorenzo" />
    <player id="83" rating="2114" title="CM" name="ZOLDAN Matteo" />
  </player_list>
</atom>
Dati e nomi sono liberamente tratti dall'elenco dell'open A di Bratto,
che sto prendendo come punto di riferimento per verificare gli
accoppiamenti.
Ad ogni giocatore poi verra' associata una sottostruttura, sempre
all'interno del file XML con le partite che ha giocato, cosi' fatta:
    <player id="73" rating="2129" title="-M" name="ASTENGO Corrado">
      <round id="1" board="9" opponent="9" color="W" result="-" />
      <round id="2" board="50" opponent="112" color="B" result="=" />
      <round id="3" board="49" opponent="102" color="W" result="=" />
      <round id="4" board="51" opponent="107" color="B" result="+" />
      ...
    </player>
In questo modo il file XML conterra' tutti i dati sufficienti a produrre
le classifiche ed elaborare il turno successivo.
Il programma e' scritto in linguaggio perl.
Il linguaggio perl e' un linguaggio standard, universale,
documentatissimo e molto potente.
Nella fattispecie, per poter leggere il file XML di cui sopra, il codice
perl e' il seguente:
use XML::Simple;
sub AtomXMLIn
{
    my $fileXML = shift;    # Filename
    my $XML = eval { XMLin($fileXML, KeyAttr => 'id', KeepRoot => 1) };
    if ( $@ ) { print "$@\n"; };
    return ($XML->{atom});
}
Tutto qui! La funzione di libreria XMLin() utilizzata, apre il file, lo
interpreta, e costruisce una struttura di array associativi basata sul
file in questione.
Dopodiche', se si vuole sapere l'elo del giocatore 73 si fa cosi':
print $atom->{player_list}{player}{73}{rating};
Per ora sono arrivato qua.
Ho impostato la struttura dati, mi sono preoccupato che questa si riesca
a leggere con facilita', che i dati una volta letti siano facilmente
manipolabili, e fin qui ci siamo.
Sto lavorando sulla procedura di ordinamento del tabellone, che fa parte
della procedura per l'elaborazione del turno seguente, e la cosa
funziona, ma non mi soddisfa ancora ne' come efficienza ne' come
eleganza. Questione di tempo.
Se qualcuno vuole, nel frattempo, cimentarsi nella realizzazione
dell'interfaccia per l'inserimento dei paramentri del torneo e dei
nominativi dei giocatori, sappia che dovra' produrre come risultato un
file XML strutturato come sopra.
Resto a disposizione per domande e chiarimenti.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

I dati di input, circa l'iscrizione dei giocatori con i vari criteri di 
ordinamento e il risultato delle partite, dovranno essere un altro file xml?
Hai intenzione di esportare i dati anche in altro sistema (ASCII) o XML sarà 
l'unico?
ciao
Peppe 

 ha scritto nel messaggio 
news:REcSe.45911
Scusatemi, ora sono sveglio e ho riletto il post iniziale, che già comprende 
le risposte ai miei quesiti.
ciao
Peppe (in ferie ;-) ) 


Ciao peppe 6 in ferie ma la settimana prossima ti vedremo a torre del greco?
La domanda è rivolta anke a tutti coloro ke parteciperanno...
francesco
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 ha scritto nel messaggio 
 > Ciao peppe 6 in ferie ma la settimana prossima ti vedremo a torre del 
greco?
Purtroppo no; mi spiace, non ho mai fatto Torre del Graco, ma quest'anno 
sono state fatte delle scelte per me impossibili; a parte il taglio, che 
quest'anno è stato abbassato a 1800, gli orari di gioco mi costringerebbero 
a rimanere a Torre per 5 giorni! Capisco che quest'orario è stato scelto per 
favorire chi lavora e smette alle 17, ma non mi va di rimanere 5 giorni 
fuori.
Vuol dire che ci rivedremo a Portici.
ciao
Peppe 


ok peppe allora ci scanneremo a portici!!tanto io credo di farmeli
entrambi...
ciauz


 ha scritto nel messaggio
[cut]
Potresti mandarmi un file completo?
ciao
Peppe 

 Potresti mandarmi un file completo?
Non esiste un file completo: XML consente di creare una struttura
aperta.
Dovresti cercare di leggerlo come XML utilizzando le librerie che hai a
disposizione piuttosto che tentare una lettura diretta.
Ad ogni modo nel messaggio iniziale ho inserito un esempio di come
verra' strutturato.
Non appena la procedura di accoppiamento secondo il sistema svizzero
standard sara' ultimata comincero' a mettere il tutto in un sito.
Un po' di pazienza che ci sto lavorando in ritagli di tempo molto
ritagliati.


eleganza. Questione di tempo.
Essendo impegnato ad arbitrare a Crema, avevo letto questo tuo post
molto velocemente ... ma adesso che lo rileggo, vorrei che mi chiarissi
cosa intendi con "Sto lavorando sulla procedura di ordinamento del tabellone, 
che fa parte della procedura per l'elaborazione del turno seguente".
Non so cosa mi sfugge, ma la procedura di ordinamento del tabellone
per il turno seguente è praticamente inesistente, per cui non capisco
come possa comportarti problemi di efficienza ed eleganza.
Ciao!
Maurizio Mascheroni
=======================================================
Maurizio Mascheroni  info chiocciola dreamchess dot com
-------------------------------------------------------
 
http://www.dreamchess.com
 
http://www.maskeret.com/micio
 
http://www.scaccobratto.com
 
http://www.italiascacchistica.com
 
http://www.romagnolionline.com
=======================================================

 come possa comportarti problemi di efficienza ed eleganza.
Si tratta, in perl, di creare un array ordinato secondo i criteri 
previsti per lo svizzero (punteggio, elo, categoria, cognome), a partire 
da un hash piuttosto complesso; in particolare le categorie risiedono in 
un array esterno da cui devo recuperare l'indice, per poterle mettere in 
ordine.
L'eleganza sta puramente nel modo in cui scrivere il tutto in perl, 
senza ridondare troppo, e senza esplicare piu' del necessario.
L'efficienza sta nel riuscire a riordinare una classifica di un migliaio 
di giocatori in un tempo accettabile.

di giocatori in un tempo accettabile.
Quello che non capisco č perchč parli di "turno seguente".


 Quello che non capisco č perchč parli di "turno seguente".
Se devo generare il turno seguente, secondo le specifiche del sistema 
svizzero, devo prendere tutti i giocatori, ordinarli per punteggio, elo, 
categoria, cognome...
Prendere quelli col punteggio piu' alto, dividerli in due gruppi S1, S2, 
  accoppiare il primo dell'S1 col primo dell'S2, il secondo del S1 col 
secondo dell'S2 previo rispetto delle condizioni che non abbiano mai 
giocato tra loro, che ci sia l'alternanza dei colori etc...
Funziona cosi' lo svizzero, se non lo sai tu....

 di giocatori in un tempo accettabile.
Penso che non debba insegnarti io come ordinare un array, comunque da quello
che è scritto sui libri di informatica l'ordinamento più veloce è il
quicksort, che se non sbaglio ha una complessità di "O(n*log n)".
Un po' di tempo fa discussi con una prof. perchè sostenevo che in realtà non
poteva essere considerato l'algoritmo più veloce per un ordinamento, questo
perchè mi venne in mente questo tipo di algoritmo (sotto provo a
spiegartelo) che in particolari condizioni risulta molto veloce:
Supponiamo di dover ordinare un array di lettere (prendiamo per questo
esempio l'alfabeto italiano, quindi 21 lettere), supponiamo che l'array
siamo molto grosso ad esempio 10000 elementi, quindi nell'array ci saranno
molti contenuti duplicati (nel senso che di lettere "a" è probaible che ce
ne sia più di una, può anche darsi che non ce ne sia ma in questo caso, ci
saranno più ripetizioni delle altre lettere), detto questo, l'algoritmo è il
seguente:
chiamiamo arrayA l'array originale ed arrayB l'array in cui ci sarà il tutto
ordinato.
si scorre tutto l'arrayA, quando si trova una lettera "a" la si mette nella
prima cella libera dell'arrayB dopodiche si continua a scorrere l'arrayA
sino alla sua fine, se si ritrovano lettere "a" si mettono sempre nella
prima cella libera dell'arrayB, arrivati infondo all'arrayA, si prende il
esame la lettera "b" e si ripete l'operazione, il tutto continua fino a che
non si arriva alla lettera "z".
Questo algoritmo scorre l'array 21 volte, quindi ha una complessità di
"21*n"  che in ambito di calcolo di complessità si valuta come "O(n)",
Logicamente il tutto porta a un notevole guadagno di tempo se abbiamo a che
fare con array che hanno una cardinalità di contenuto limitata (se ci sono
tante lettere che si ripetono), se l'array è molto grosso rispetto alla
cardinalità del contenuto e soprattutto se sappiamo a priori quale può
essere il contenuto di ogni cella dell'array.
Se avessimo un array di 21 elementi e dovessimo usare questo algoritmo la
complessità risulterebbe sempre "21*n" ma in questo caso ai fini pratici
avremmo una complessità di "O(n^2)" dato che n (numero di celle dell'array)
è uguale al numero di cardinalità di contenuto.
Una variante del tutto può essere quella non continuare il ciclo fino
all'ultima lettera dell'alfabeto, ma di fermarsi quando l'arrayB risulta
pieno, infatti se per caso nell'arrayA ci sono solo lettere "a" con questa
variante basta solo una passata dell'array per terminare il lavoro.
In generale la complessità di questo algoritmo è "O(k*n)" dove "k" è una
costante del problema ed indica il numero di possibili valori che può
assumere una determinata cella, ed "n" è il numero di celle dell'array.
se k<<n  siamo nel caso migliore.
se k=n (o comunque paragonabile) siamo nel caso in cui la complessità, a
livello pratico, diventa O(n^2), in realtà per essere rigorosi la
complessità O(k*n) = O(n) (questo lo aggiunto perchè tanto lo so che
qualcuno avrebbe criticato)
se k>>n  ai fini pratici si prende questo algoritmo e lo si tira nel cesso
:-((
Penso che questo algoritmo ti possa tornare molto utile per ordinare l'array
delle categorie, dato che queste sono in numero limitato.
Logicamente diventa impensabile ordinare con questo algoritmo i nomi e i
cognomi dei giocatori.
Sono sicurissimo di aver scoperto l'acqua calda e che questo algoritmo è gia
famoso in tutto il mondo dei programmatori professionisti e non....ma
sinceramente non ho la minima idea di come si chiami e non ne ho mai trovato
traccia su libri universitari (probabilmente un motivo c'è).
Se non ha un nome (ed è impossibile) lo batteziamo "VeryQuickSortSeHaiCulo"
:-))
Ciao
Vinsanto

 spiegartelo) che in particolari condizioni risulta molto veloce:
Dimenticavo di aggiungere che comunque nella discussione poi la prof ebbe la
meglio perchè gli algoritmi devono essere valutati nel loro "caso peggiore",
in effetti poi mi sono reso conto che stavo mettendo in crisi un po' di anni
di studio di complessità con la mia presunzione dato che è dimostrato che
non si puo scendere in un ordinamento al di sotto di O(n*log n), o almeno mi
sembra di ricordare che la dimostrazione arrivi a questo limite (vado a
memoria di un esame di un po' di anni fa...se ho commesso imprecisioni
scusatemi ma ora non ho voglia di rimettermi a sfogliare gli appunti, semmai
controllerò domani)
Ciao
Vinsanto

Funziona cosi' lo svizzero, se non lo sai tu....
L'ordinamento per punteggio, elo, categoria, cognome, altezza&peso, devi
farlo soltanto una volta, prima del PRIMO TURNO.
Dopodichè ti ritrovi con un "numero d'ordine" per ogni giocatore, chiamato
anche "numero di sorteggio" (anche se è un termine un pò improprio),
e quello e solo quello ti servirà per metterli in ordine, oltre ai punti in
classifica.
In sostanza ...
1) avrai una "routine" per la generazione del numero d'ordine; fatta girare
   una volta, non dovrà girare più.
2) per ogni turno, compreso il primo, l'ordinamento lo farai soltanto in
   base ai punti in classifica e al numero di sorteggio; e qui (ecco la
   cosa che non capivo) non c'è efficienza ed eleganza che tenga: si fa in
   un nientesimo di secondo.
Siccome nell'esempio di file XML che hai postato hai messo un campo chiamato
"id" (che è poi il numero d'ordine), la frase "turno seguente" mi sembrava
in contraddizione: se ti metti OGNI VOLTA a rigenerare il numero d'ordine non
vai a casa più :-)


 memoria di un esame di un po' di anni fa...
Il limite di nlogn vale per un'altra classe di algoritmi, quelli
basati esclusivamente su confronti e scambi. Il radix sort, per
essere applicabile, richiede delle ipotesi ben più forti.
Ciao
P.

 Penso che non debba insegnarti io come ordinare un array, 
[CUT]
In effetti il linguaggio perl implementa il sort come comando nativo, ed 
applica in modo estremamente efficiente l'algoritmo migliore.
Il mio problema non e' quello di riordinare l'array, che ci riesco 
benissimo, ma e' quello di riordinarlo in modo elegante.
Il problema e' la funzione di confronto.
Quella che confronta il punteggio (banale), a parita' di punteggio 
confronta l'elo (banale pure qua) e a parita' di elo confronta la 
categoria (e qui sto cercando di risolvere il busillis, visto che un 
confronto diretto tra le categorie non ha senso)
Il tutto utilizzando la struttura dati che sto utilizzando.
Faccio meno fatica a postare un esempio di codice che a spiegare tutto 
cio'...
Portate pazienza.


Tante volte uno indica la luna, e l'altro si limita a vedere il dito.
Prendo atto della finezza.
Ho applicato troppo alla lettera le specifiche dello svizzero. Il tuo 
suggerimento e' decisamente piu' efficiente.
Pero'...  pero'... se uno entra al secondo turno?
E in ogni caso l'ordinamento va fatto almeno la prima volta.

Pero'...  pero'... se uno entra al secondo turno?
Lo Swiss Master (esempio) ti permette di cambiarlo manualmente, cosa che ti consiglio
di fare: in pratica dopo aver fatto l'ordinamento, è sempre possibile, con
lo Swiss Master, mandare up&down i giocatori con una apposita funzione
in modo da creare l'ordinamento che si vuole.
Tutti i problemi che affronterai sono già stati affrontati e risolti dagli
altri software; ti rinnovo l'invito a vedere le funzionalità della "concorrenza".
Tutti i software li trovi sul sito del settore arbitrale, mentre lo Swiss Master
per Windows lo trovi su 
http://www.schaakbond.nl/
 (è commerciale, ma la versione
demo che potrai scaricare è perfettamente funzionante per 3 turni).


P.
Ciao
Vinsanto
P.S. Radix possibile che ritrovarti ovunque?...Stai invadendo anche altre
galassie? :-))

 ha scritto nel messaggio
news:1126026779.6...@f14g2000cwb.googlegroups.com...
Dimenticavo....sei il solito pierpaolo che lavorava sul CLISP e che ha
trovato il numero di soluzioni dei sexomini?
Ciao
Vinsanto

 trovato il numero di soluzioni dei sexomini?
Sono sempre il solito!   8^)
Ciao
P.