Алгоритм одиночного турнира на выбывание, где выбывшие команды также соревнуются за оставшиеся места - PullRequest
0 голосов
/ 28 марта 2020

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

Single elimination tournament

Чтобы уточнить, турнир начинается с 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

Итак, я генерирую следующую ветвь вторых матчей и планирую объединить ее с основной веткой. Проблемы возникают, если у меня больше двух проигрышных матчей в скобках.

Любая помощь и предложение будет высоко ценится!

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...