Подсчитайте две равные команды с рейтингом игрока - PullRequest
0 голосов
/ 20 декабря 2018

Я часто играю в игру, где у каждого игрока есть рейтинг.Например, 1678 или 1820. Когда вы выигрываете игру, вы получаете очки, когда вы теряете, вы теряете очки.

Теперь, когда 8 игроков присоединяются к лобби, мы хотим иметь равные команды (4 на 4) или как можно ближе.насколько возможно, рейтинг мудрый.Всегда есть 2 команды и игроки от 3 до 8 (тоже могут быть неравные команды, например 2 на 1).

Какой алгоритм я могу использовать для создания двух одинаковых команд в JavaScript?

Например:

ratings = [1466, 1678, 1988, 1200, 1362, 1555, 1844, 1600];

team 1: [xxxx,xxxx,xxxx,xxxx] ??
team 2: [xxxx,xxxx,xxxx,xxxx] ??

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

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

function distribute(arr) {
  arr.sort().reverse()
  let a = [], b = [], sumA = 0, sumB = 0, i = 0

  while (i < arr.length) {
    if (!sumA && !sumB || sumA == sumB) {
      a.push(arr[i])
      sumA += arr[i]
    } else if (sumA < sumB) {
      a.push(arr[i])
      sumA += arr[i];
    } else if (sumB < sumA) {
      b.push(arr[i])
      sumB += arr[i];
    }
    i++
  }
  
  console.log(`Total: ${sumA} ${sumB}`)
  return [a, b]
}

console.log(distribute([1466, 1678, 1988, 1200, 1362, 1555, 1844, 1600]))
console.log(distribute([1466, 6000, 1988, 1200, 1362, 1555, 1844, 1600]))
0 голосов
/ 21 декабря 2018

Я знаю, что вы спросили в javascript, но, возможно, это может быть полезно для вас.Все, что я сделал, это получил среднее значение массива (сумма всех значений и / с количеством команд, в моем случае это 2 команды) => отсортированный массив => помещенные значения в массив team1 до суммы массива team1>затем среднее значение => оставленное значение передается в массив team2

    ratings = [1306, 1578, 1458, 1450,1602, 1355, 1454, 1300]
    from functools import reduce
    class match_making(object):
        team1 = []
        team2 = []
        def __init__(self,ratings): 
            self.ratings = ratings
        def get_value(self):
            self.average_value = reduce(lambda x,y: x + y / 2 ,self.ratings)
        def split_players (self):
            x = 0
            for player in sorted(self.ratings):
                x = x + player
                if x < self.average_value:
                    self.team1.append(player)
                    print(x)
                elif x > self.average_value:
                    self.team2.append(player)

        def dowork(self):
            self.get_value()
            self.split_players()
            some = reduce(lambda x , y :x +y , self.team1) #just too see average rating of the team1
            some2 = reduce(lambda x , y :x +y , self.team2)# same as above for team2
            return some,some2,self.team1,self.team2


    divide_players = match_making(ratings)
    print(divide_players.dowork())
0 голосов
/ 20 декабря 2018

Отредактировал это, чтобы сделать это немного более кратким и переместил сравнение снаружи для ясности.Но это делает основное распределение игроков после сортировки по рангу.

let ratings = [1466, 1678, 1988, 1200, 1362, 1555, 1844, 1600];

let team1 = [];
let team2 = []; 

const sortNumber = (n1, n2) => {
  if(n1 > n2) return -1;
  if(n1 < n2) return 1;
  return 0;
};


// Simple distibution
function distributePlayers(arrPlayers) {

  let sortedPlayers = arrPlayers.sort(sortNumber);
  console.log(sortedPlayers);
  let teams = [[],[]];
  
  sortedPlayers.forEach((player, index) => {
      teams[index%2].push(player);
  });
  
  return teams;
}

distributePlayers(ratings).forEach(team => {
  console.log(team);
});

Вот базовая сортировка и распространение.

let ratings = [1466, 1678, 1988, 1200, 1362, 1555, 1844, 1600];

let team1 = [];
let team2 = []; 


// Simple distibution
function distributePlayers(arrPlayers) {
  let sortedPlayers = arrPlayers.sort((p1, p2) => {
    if(parseInt(p1) > parseInt(p2)) {
      return -1;
    } else if (parseInt(p1) < parseInt(p2)) {
      return 1;
    }
    return 0;
  });
  console.log(sortedPlayers);
  let teams = [[],[]];
  
  sortedPlayers.forEach((player, index) => {
      let teamIndex = index%2;
      teams[(teamIndex)].push(player);
  });
  
  return teams;
}

distributePlayers(ratings).forEach(team => {
  console.log(team);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...