计算两个具有球员评分的相等球队
Calculate two equal teams with player rating
我经常玩每个玩家都有等级的游戏。比如1678或者1820。赢了就得分,输了就丢分。
现在,当 8 名玩家加入一个大厅时,我们希望拥有平等的团队 (4v4),或者尽可能接近,评级明智。总是有 2 支球队和 3 到 8 名球员(也可以是不平衡的球队,比如 2v1)。
我可以使用什么算法在 JavaScript 中创建两个相等的团队?
例如:
ratings = [1466, 1678, 1988, 1200, 1362, 1555, 1844, 1600];
team 1: [xxxx,xxxx,xxxx,xxxx] ??
team 2: [xxxx,xxxx,xxxx,xxxx] ??
对其进行了编辑,使其更加简洁,并为清楚起见将比较移到了外面。但这确实是按排名排序后玩家的基本分布。
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);
})
您可以先对其进行排序,然后根据每个数组的总和添加到第一个或第二个数组。
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]))
我知道你在 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())
我经常玩每个玩家都有等级的游戏。比如1678或者1820。赢了就得分,输了就丢分。
现在,当 8 名玩家加入一个大厅时,我们希望拥有平等的团队 (4v4),或者尽可能接近,评级明智。总是有 2 支球队和 3 到 8 名球员(也可以是不平衡的球队,比如 2v1)。
我可以使用什么算法在 JavaScript 中创建两个相等的团队?
例如:
ratings = [1466, 1678, 1988, 1200, 1362, 1555, 1844, 1600];
team 1: [xxxx,xxxx,xxxx,xxxx] ??
team 2: [xxxx,xxxx,xxxx,xxxx] ??
对其进行了编辑,使其更加简洁,并为清楚起见将比较移到了外面。但这确实是按排名排序后玩家的基本分布。
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);
})
您可以先对其进行排序,然后根据每个数组的总和添加到第一个或第二个数组。
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]))
我知道你在 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())