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)

FER MAR MAT SER VIC

↓ barreja aleatòria

MAT FER VIC MAR SER

↓ + posició de descans (5 és imparell → 6 llocs)

MAT FER VIC MAR SER —

↓ rotació round-robin (5 voltes)

J1FER–SERVIC–MARdescansa MAT
J2MAT–SERFER–VICdescansa MAR
J3MAT–MARSER–VICdescansa FER
J4MAT–VICMAR–FERdescansa SER
J5MAT–FERMAR–SERdescansa 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 FER VIC MAR SER —

↓ MAT es manté fixe; la resta gira una posició

Cercle abans de la jornada 2

MAT — FER VIC MAR SER

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.