Atzar i justícia esportiva
Aquest article seguix, pas a pas amb els cinc jugadors, el recorregut exacte que fa el codi per a composar el calendari.
Jugadors (ordre de la tabla)
↓ barreja aleatòria
↓ + posició de descans (5 és imparell → 6 llocs)
↓ rotació round-robin (5 voltes)
| J1 | FER–SER | VIC–MAR | descansa MAT |
|---|---|---|---|
| J2 | MAT–SER | FER–VIC | descansa MAR |
| J3 | MAT–MAR | SER–VIC | descansa FER |
| J4 | MAT–VIC | MAR–FER | descansa SER |
| J5 | MAT–FER | MAR–SER | descansa VIC |
Recorregut complet d'una execució real, a partir d'un ordre inicial triat a l'atzar.
El programa partix sempre de la mateixa llista de partida: els
cinc jugadors tal com estan escrits a la tabla de classificació.
Abans de fer res amb aquesta llista, la reordena a l'atzar: recorre
les posicions començant per la última i, en cada una, la
intercanvia amb una altra posició escollida a l'atzar entre les que
encara no han tocat. Es coneix com a barreja de Fisher–Yates, i
és exactament el que fa la funció
barajar() del codi:
for (let i = copia.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
// intercanvia copia[i] amb copia[j]
}
El resultat és la segona fila de l'esquema: els mateixos cinc noms, però ara en un altre ordre ( per exemple, MAT, FER, VIC, MAR i SER). Aquest nou ordre és el que s'utilitzarà per a composar tot el calendari.
Com que som cinc jugadors i el pas seguent necessita un nombre parell de posicions per a funcionar, la llista es completa amb una sisena posició buida, que és la tercera fila de l'esquema. Aquesta posició no correspon a cap jugador, però participa igual que la resta: quan li toca emparellar-se amb algú, eixe jugador és qui descansa. Amb les sis posicions, el programa forma els primers partits unint dels extrems cap a dins (la posició 1 amb la 6, la 2 amb la 5, la 3 amb la 4). És la fila «J1» de la taula.
Per a passar a la jornada seguent, les posicions es reorganitzen:
la primera es queda on està i les altres cinc giren un lloc, de
manera que l'últim passa a ocupar la segona posició
(resto.unshift(resto.pop())
en el codi). Es pot veure comparant els dos cercles següents:
Cercle abans de la jornada 1
↓ MAT es manté fixe; la resta gira una posició
Cercle abans de la jornada 2
MAT no es mou d'aquesta primera posició en cap moment; és la resta de jugadors, junt amb la posició buida, els que van avançant una posició a cada vegada. Tornant a unir els extrems cap a dins amb aquest nou cercle, ixen emparellaments diferents dels de la jornada anterior. Aquest mateix gir es repetix quatre vegades més i, cada vegada, torna a canviar qui queda al costat de qui, fins a completar les cinc files de la taula de l'esquema, de J1 a J5.
Encara hi ha un últim pas: l'ordre en que aquestes cinc jornades es mostren a la pantalla es torna a barrejar, i dins de cada partit també se sorteja quin dels dos noms apareix a l'esquerra i quin a la dreta.