Я создаю заявку на теннисный турнир и хочу сгенерировать матчи для одного турнира на выбывание, который выглядит следующим образом: Турнирные скобки , и команды, которые будут выбраны, должны будут бороться за себя оставшиеся позиции.

Чтобы уточнить, турнир начинается с N количеством команд, в приведенном выше примере у нас есть 8 команд, которые впервые соревнуются в 2 группы A и B и сыграют в общей сложности 12 матчей (Круглый Робин), затем, на следующем этапе, победитель группы A играет с последней командой в группе B и так далее, пока у нас не появятся скобки, показанные с матча 13 до матч 16. Затем победители начинают играть на главной стороне, а проигравшие на второй стороне соревнуются за оставшуюся позицию. Распределение матчей по фазам происходит следующим образом: на следующем этапе первые матчи проводятся проигравшими командами, после того, как все проигранные командные сетки были сыграны, затем командные победители будут играть так, как показано выше, матч № 17 и 18 - это проигранные командные матчи «второй стороны», за которыми следуют матчи 19 и 20, которые являются матчами победителей «главной стороны».
Наивный алгоритм, разработанный мной в javascript, в котором я пытаюсь Аргумент «достижения» - это массив фаз совпадений, который сообщит мне, по порядку, сколько будет сыграно «второстепенных» совпадений, а затем, сколько совпадений «основной стороны»:
const generateMatchesBrakets = (mainSideMatches) => {
let matchesPlayed = [];
let stage = 0;
while ( parseInt(mainSideMatches) ) {
let secondSideMatches = parseInt(secondSideMatches / 2);
if ( matchesPlayed[stage] === undefined ) matchesPlayed[stage] = [];
matchesPlayed[stage]['main'] = [];
for(let i = 0; i < mainSideMatches; i++) matchesPlayed[stage]['main'].push(1);
if (secondSideMatches) {
let nextRound = stage + 1;
if ( matchesPlayed[nextRound] === undefined ) matchesPlayed[nextRound] = [];
matchesPlayed[nextRound]['second'] = [];
for (let i = 0; i < secondSideMatches; i++) matchesPlayed[nextRound]['second'].push(1);
}
mainSideMatches /= 2;
stage++;
}
return matchesPlayed;
}
let teams = 8;
let n = teams / 2;
if (n % 2 !== 0) n++;
let mainTournamentBrackets = generateMatchesBrakets(n);
let secondTournamentdBrackets = [];
mainTournamentBrackets.forEach( bracket => {
if ( bracket['second'] ) {
let n = bracket['second'].length;
secondTournamentdBrackets.push( generateMatchesBrakets(n) );
}
})
Структура, для которой я пытаюсь достичь 8 команд - это следующее
(3) [Array(0), Array(0), Array(0)]
0: [main: Array(4)]
1: [second: Array(2), main: Array(2)]
2: [second: Array(3 /*+ 2 from second matches*/) , main: Array(1)]
length: 3
Итак, я генерирую следующую ветвь вторых матчей и планирую объединить ее с основной веткой. Проблемы возникают, если у меня больше двух проигрышных матчей в скобках.
Любая помощь и предложение будет высоко ценится!
Заранее спасибо!