0

ノックアウト トーナメントのブランク マッチを生成できるようにしたいと考えています。これが私の言いたいことの例です。

8 チームによるノックアウト トーナメントがあるとしMath.log(teamList.length)/Math.log(2)ます。トーナメントには 3 ラウンドあると計算していました。

各ラウンドでのマッチ数を計算するための一般的なルールは次のとおりです。

numberOfRounds = n    [ [2^n-1 matches], ...., [2^0 matches] ]

このことから、8 チームのトーナメントでは 3 ラウンドがあり、トーナメントは次のようになることがわかります。

[ [4 matches], [2 matches], [1 match] ]

各試合は配列として保存されるため、たとえば 8 チーム トーナメントの準決勝は次のようになります。

[ [team1,team2], [team3,team4] ]

チームのリストを取得し、トーナメントの空白の試合のセットを生成できることを意味するコードを生成しようとしています。

したがって、8 チームのリストをトーナメントに渡すと、次のマッチ配列が生成されます。

[
  [ [], [], [], [] ],
  [ [], [] ],
  [ [] ]
]

これを行う方法について誰かアイデアがありますか?これまでのところ、次のものしかありません。

for(var i = 0; i < numRounds; i++) {
      matches.push([]);
}

これはトーナメントの各ラウンドを生成するため、8 チームの場合、長さ 3 の配列が生成されますが、各ラウンド内で必要な数の試合を生成する方法がわかりません。

4

4 に答える 4

2

これにより、指定された数のチームに対して空の一致配列が生成されます。

function genMatches (nTeams) {
    var matchArray = [];
    while (nTeams > 1) {
        nTeams = (nTeams + 1) >> 1;
        var matches = [];
        for (var i = 0; i < nTeams; ++i) {
            matches.push([]);
        }
        matchArray.push(matches);
    }
    return matchArray;
}

2の累乗ではないチーム数を正しく処理する必要があります。バイラウンド用のスロットが生成されます(チームの数が奇数の場合)。

于 2013-03-13T18:00:42.183 に答える
1

どのチームとも組になっていないチームがすでに次のラウンドの資格を得ているかどうかを仮定します

function genMatches(a, match = 0, stage = {}) {
  let isOdd = false
  if (a === 1) {
    return match;
  }
  if (a % 2) {
    isOdd = true;
    a = a - 1;
  }
  match = match + Math.floor(a / 2);

  stage[Object.keys(stage).length] = new Array(Math.floor(a / 2)).fill([[],[]])
  a = Math.floor(a / 2)
  if (isOdd)
    a = a + 1;
 stage = {...stage,... genMatches(a, match, stage)};
 return stage;
}
于 2019-08-20T11:16:41.170 に答える
0

 function matches(TotalTeams) {
        let teams = TotalTeams;
        let matches = [];
        let extraTeam = 0;

        while(teams > 1 ){
            if(teams % 2 === 1){
                teams = ((teams-1)/2);
                extraTeam  = extraTeam + 1
                matches.push(teams);
            }
            else{
                teams = ((teams)/2);
                matches.push(teams);
            }
            if(teams === 1){
                const add = (a, b) => a + b;
                const totalMatches = matches.reduce(add);
                return (totalMatches + extraTeam)
                
            }
           
        }
    }  
    
document.getElementById("33").innerHTML = matches(33);
document.getElementById("64").innerHTML = matches(64);
document.getElementById("69").innerHTML = matches(69);
document.getElementById("82").innerHTML = matches(82);
document.getElementById("98").innerHTML = matches(98);
   
33 teams will play <span id="33"></span> matches<br/>
64 teams will play <span id="64"></span> matches<br/>
69 teams will play <span id="69"></span> matches<br/>
82 teams will play <span id="82"></span> matches<br/>
98 teams will play <span id="98"></span> matches<br/>

于 2019-10-11T07:48:30.867 に答える