Первый тур:
home: [t0 t1 t2 t3 t4 ]
guest: [t5 t6 t7 t8 t9 ]
Второй тур:
home: [t0 t5 t1 t2 t3]
guest: [t6 t7 t8 t9 t4]
третий тур:
home: [t0 t6 t5 t1 t2]
guest: [t7 t8 t9 t4 t3]
trans := случайная перестановка чисел 0 … N−1
если N чётное
то M := N−1
иначе M := N
цикл 2half = false…true
цикл round = 0…M−1
цикл shift = 1…[M/2]
home := (round + shift) % M
away := (round + M − shift) % M
если (shift нечётное) xor 2half
обменять home, away
вывести trans[home], trans[away]
если N чётное
home := round
away := M
если (round нечётное) xor 2half
обменять home, away
вывести trans[home], trans[away]
// На входе - массив с командами и опционально - необходимый тур
function schedule(array, round) { // если тур не указан - создаётся всё расписание целиком
if (!round) {
var teams = array.length,
// точка, после которой команды будут меняться местами "дома - гость"
halfTour = (teams - 1),
totalRounds = halfTour * 2,
matchesPerRound = teams / 2,
matches = [],
rounds = [],
round,
match,
home,
away,
swap,
currentRoundText;
for (round = 0; round < totalRounds; round++) {
currentRoundText = [(round + 1)];
matches = [];
for (match = 0; match < matchesPerRound; match++) {
home = (round + match) % (teams - 1);
away = (teams - 1 - match + round) % (teams - 1);
if (match === 0) {
away = teams - 1;
}
if (round >= halfTour) {
swap = home;
home = away;
away = swap;
}
currentRoundText += ('[' + array[home]+ ' ' + array[away] + ']');
matches.push([array[home], array[away]]);
}
console.log(currentRoundText);
rounds.push(matches);
}
return rounds;
}
// Если раунд указан, просчитывается весь турнир и берется нужный элемент массива
return schedule(array)[round - 1];
}