Tournament bracket placement algorithm

前端 未结 10 586
生来不讨喜
生来不讨喜 2020-12-02 09:37

Given a list of opponent seeds (for example seeds 1 to 16), I\'m trying to write an algorithm that will result in the top seed playing the lowest seed in that round, the 2nd

相关标签:
10条回答
  • 2020-12-02 09:56

    A C version.

    int * pctournamentSeedArray(int PlayerCnt)
    {
        int * Array;
        int * PrevArray;
        int i;
    
        Array = meAlloc(sizeof(int) * PlayerCnt);
    
        if (PlayerCnt == 2)
        {
            Array[0] = 0;
            Array[1] = 1;
            return Array;
        }
    
        PrevArray = pctournamentSeedArray(PlayerCnt / 2);
        for (i = 0; i < PlayerCnt;i += 2)
        {
            Array[i] = PrevArray[i / 2];
            Array[i + 1] = (PlayerCnt - 1) - Array[i] ;
        }
        meFree(PrevArray);
        return Array;
    }
    
    0 讨论(0)
  • 2020-12-02 09:58
    # Here's one in python - it uses nested list comprehension to be succinct:
    
    from math import log, ceil
    
    def seed( n ):
        """ returns list of n in standard tournament seed order
    
        Note that n need not be a power of 2 - 'byes' are returned as zero
        """
    
        ol = [1]
    
        for i in range( ceil( log(n) / log(2) ) ):
    
            l = 2*len(ol) + 1
    
            ol = [e if e <= n else 0 for s in [[el, l-el] for el in ol] for e in s]
    
        return ol
    
    0 讨论(0)
  • 2020-12-02 10:02

    I worked on a PHP / Laravel plugin that generates brackets with / without preliminary round robin. Maybe it can be useful to you, I don't know what tech you are using. Here is the github.

    https://github.com/xoco70/kendo-tournaments

    Hope it helps!

    0 讨论(0)
  • 2020-12-02 10:03
    • At each round sort teams by seeding criteria
    • (If there are n teams in a round)team at ith position plays with team n-i+1
    0 讨论(0)
  • 2020-12-02 10:05

    This JavaScript returns an array where each even index plays the next odd index

    function seeding(numPlayers){
      var rounds = Math.log(numPlayers)/Math.log(2)-1;
      var pls = [1,2];
      for(var i=0;i<rounds;i++){
        pls = nextLayer(pls);
      }
      return pls;
      function nextLayer(pls){
        var out=[];
        var length = pls.length*2+1;
        pls.forEach(function(d){
          out.push(d);
          out.push(length-d);
        });
        return out;
      }
    }
    
    > seeding(2)
    [1, 2]
    > seeding(4)
    [1, 4, 2, 3]
    > seeding(8)
    [1, 8, 4, 5, 2, 7, 3, 6]
    > seeding(16)
    [1, 16, 8, 9, 4, 13, 5, 12, 2, 15, 7, 10, 3, 14, 6, 11]
    
    0 讨论(0)
  • 2020-12-02 10:07

    Since this comes up when searching on the subject, and it's hopeless to find another answer that solves the problem AND puts the seeds in a "prettier" order, I will add my version of the PHP code from darkangel. I also added the possibility to give byes to the higher seed players.

    This was coded in an OO environment, so the number of participants are in $this->finalists and the number of byes are in $this->byes. I have only tested the code without byes and with two byes.

      public function getBracket() {
          $players = range(1, $this->finalists);
          for ($i = 0; $i < log($this->finalists / 2, 2); $i++) {
            $out = array();
            $reverse = false;
            foreach ($players as $player) {
              $splice = pow(2, $i);
              if ($reverse) {
                $out = array_merge($out, array_splice($players, -$splice));
                $out = array_merge($out, array_splice($players, 0, $splice));
                $reverse = false;
              } else {
                $out = array_merge($out, array_splice($players, 0, $splice));
                $out = array_merge($out, array_splice($players, -$splice));
                $reverse = true;
              }
            }
            $players = $out;
          }
          if ($this->byes) {
            for ($i = 0; $i < $this->byes; $i++ ) {
              for ($j = (($this->finalists / pow(2, $i)) - 1); $j > 0; $j--) {
                $newPlace = ($this->finalists / pow(2, $i)) - 1;
                if ($players[$j] > ($this->finalists / (pow(2 ,($i + 1))))) {
                  $player = $players[$j];
                  unset($players[$j]);
                  array_splice($players, $newPlace, 0, $player);
                }
              }
            }
            for ($i = 0; $i < $this->finalists / (pow(2, $this->byes)); $i++ ) {
              $swap[] = $players[$i];
            }
            for ($i = 0; $i < $this->finalists /(pow(2, $this->byes)); $i++ ) {
              $players[$i] = $swap[count($swap) - 1 - $i];
            }
            return array_reverse($players);
          }
          return $players;
        }
    
    0 讨论(0)
提交回复
热议问题