2012-12-19 11 views
0

여기 JavaScript 및 Jquery를 사용하여 대괄호를 표시하는 토너먼트 브래킷 시스템을 만드는 데 사용 된 게시물이 있습니다.토너먼트 종자 정렬을위한 JavaScript

16 명이 1-16 명의 시드를 받았습니다. 다음 순간 내 분류 씨는 다음과 같습니다

[1,8],[4,5],[2,7],[3,6]

당신이 볼 수 있듯이, 그것은 어느 정도 작동하지만 준결승이 잘못된 것이 1v4와 2v3 될 것입니다. 준 결승전을 1v3 및 2v4로하고 싶습니다.하지만 무엇을 시도하든 인쇄물을 인쇄 할 수없는 것 같습니다. 그래서되어야합니다 :

[1,8],[3,6],[5,4],[7,2]

이것은 또한 당신이 종이에 괄호 볼 때, 상관없이 1, 2 브래킷의 양단에 있다는 의미에서 올바른 없지만, 그렇게 만드는 것 노력해. 작동하지 않아.

EDIT : 16/32 팀 토너먼트에서 더 많은 팀에서 일하기를 원합니다. 그러나이 알고리즘으로 시도 할 때 올바른 시드를 얻지 못했습니다.

여기 내 코드입니다 :

var seeds = [ 1,2,3,4,5,6,7,8], 
    num_rounds = Math.log(seeds.length)/Math.log(2); 

// 2-dimensional array 
// Each subarray holds the seeds active in that round in order of matches played 
// Example: 
// seeds in first match of 2nd round are: bracket_round[1][0] & bracket_round[1][1] 
var bracket_round = []; 

// Create empty arrays inside bracket_round 
for(var i = 0; i < num_rounds; i++) { 
    bracket_round[i] = []; 
} 

// Assuming no upsets 
// Final is seed 1 and seed 2 
bracket_round[num_rounds] = [ seeds[0], seeds[1] ]; 

// For each round in the bracket 
for(var roundNum = num_rounds; roundNum > 0; roundNum--) { 
    var round = bracket_round[roundNum]; 
    var prev_round = bracket_round[roundNum - 1]; 

    // For each seed in the round, work out who they defeated in previous round, storing result 
    for(var m = 0; m < round.length; m++) { 
    // round.length = number of matches in the round 
    // number of teams in the round will be, number of matches * 2 
    var num_teams_in_round = round.length * 2; 

    // previous match team A = current match team "m" 
    prev_round[m * 2] = round[m]; 

    // previous match team B = (# teams in previous round + 1) - (current match seed "m") 
    prev_round[(m * 2) + 1] = (num_teams_in_round + 1) - round[m]; 
    } 
} 

document.write(bracket_round[1]); 

var singleElimData = { 
    teams : [    // Matchups 
     [ bracket_round[1][0], bracket_round[1][1] ], 
    [ bracket_round[1][2], bracket_round[1][3] ], 
    [ bracket_round[1][4], bracket_round[1][5] ], 
    [ bracket_round[1][6], bracket_round[1][7] ] 
    ], 
    results : [[ 
     [ [1, 0], [1, 0], [1,0], [1, 0] ], 
     [ [1, 0], [1, 0] ], 
     [ [1, 0], [0, 1] ] 
    ] 
    ] 
} 

$(function() { 
    $('#singleElim').bracket({ 
     init: singleElimData 
    }) 
}) 

1 = 0001 0001 = 1 
2 = 0010 0011 = 3 
3 = 0011 0010 = 2 
4 = 0100 0110 = 6 
5 = 0101 0111 = 7 
6 = 0110 0101 = 5 
7 = 0111 0100 = 4 
8 = 1111 1000 = 8 
+0

그래서 이미 일치하지 않은 가장 높은 시드가 이미 일치하지 않은 가장 낮은 시드와 쌍을 이루기를 원하십니까? 아니면 무작위로 파종할까요? – Ryan

+0

그리고 왜 당신은 혼란이 없다고 가정합니까? 실제 응용 프로그램에서 이것을 사용하려고합니까 아니면 항상 똑같은 방식으로 끝나는 '브래킷'을 생성하기 위해이 작업을 수행하고 있습니까? 이것은 실제로 당신이 문제에 접근해야하는 방식을 크게 바꿔 놓았 기 때문에 실제로 아는 것이 중요합니다. – Ryan

+0

나는 최선의 방법을 확신하지 못합니다. 최선의 방법은 각 시드를 괄호의 ​​어느 한쪽으로 보내는 것입니다. 그래서 처음에는 1과 2가 대괄호의 어느 한쪽으로 전송 된 다음 3이 1의쪽에 합류하고 4는 2의쪽에 합류하게됩니다. 내가 가진 다른 문제는 1과 2를 대괄호의 반대쪽 끝에서 시작할 수 없다는 것입니다 일반 괄호처럼 쉽게 읽을 수 있도록합니다. – germainelol

답변

0

당신이 트리를 만들 때이 선수 가장자리를 결정하기 위해 그레이 코드를 사용할 수 있습니다. 기본적으로 그것은 비트를 반대로하고 1을 더합니다. 여기를 읽으십시오 : http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/229068.

+0

미안하지만 Ruby 코딩에 대해 전혀 모른다. – germainelol

+0

팀 수를 회색 코드로 변환하고 비트를 사용하여 트리를 탐색한다. – Bytemain

+0

두렵지 않아서 원본 코드 하단에 그레이 코드 코드를 추가했습니다. 시드 된 첫 번째 대괄호를 만드는 데 도움이되는 방법은 무엇입니까? 그 길에 도움을 주셔서 감사합니다 – germainelol