Created
October 17, 2023 09:20
-
-
Save samuelchou/321d27cbfc184b26999b59530ce1bc74 to your computer and use it in GitHub Desktop.
Group Function by Ryan Shanh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Description: Grouping member into table, by Ryan Shanh, 2023/10/17 | |
function getRandomInt(max) { | |
return Math.floor(Math.random() * max); | |
} | |
var memberList = []; | |
var memberLimit; | |
var tableMax; | |
var tableLimit = []; | |
var curTableCnt = []; | |
var isAssigned = false; | |
var memberQueue = []; | |
var waitNum = 0; | |
function groupMember(totalRound, totalMember, totalTable, maxMemberPerTable) { | |
tableMax = totalTable; | |
memberLimit = totalMember; | |
// 初始化每個人的桌輪記錄 | |
for(var i=0; i<memberLimit; i++) { | |
memberList[i] = []; | |
} | |
// 初始化每桌的人數上限 | |
for(var i=0; i<tableMax; i++) { | |
tableLimit[i] = maxMemberPerTable; | |
} | |
// 開始依照輪數執行分桌流程 | |
for(var i=0; i<totalRound; i++) { | |
console.log("execute round " + i); | |
executeRound(); | |
} | |
} | |
function executeRound() { | |
// 初始化新一輪的桌子(tableMax 張空桌) | |
for(var i=0; i<tableMax; i++) { | |
curTableCnt[i] = []; | |
} | |
// 初始化新一輪的隊伍(待分桌) | |
memberQueue = []; | |
// 依照總人數加入隊列 | |
for(var i=0; i<memberLimit; i++) { | |
memberQueue.push(i); | |
} | |
// 當還有人在排隊時,持續幫他分桌 | |
waitNum = memberQueue.length; | |
while(waitNum > 0) { | |
// 取出隊列中第一位,為其分配桌位 | |
assignTable(memberQueue.shift()); | |
} | |
} | |
function assignTable(memberNum) { | |
isAssigned = false; | |
while(!isAssigned) { | |
// 隨機分配一桌 | |
let tmpTable = getRandomInt(tableMax); | |
// 當該桌還有空位 | |
if(curTableCnt[tmpTable].length < tableLimit[tmpTable]) { | |
// 且成員還沒去過該桌 | |
if(!memberList[memberNum].includes(tmpTable)) { | |
// 該桌記錄下該輪新成員 | |
curTableCnt[tmpTable].push(memberNum); | |
// 成員記錄下該桌 | |
memberList[memberNum].push(tmpTable); | |
// 順利分配,等待人數 -1 | |
waitNum--; | |
// 成功分配(跳出迴圈) | |
isAssigned = true; | |
} | |
} | |
// 當該桌沒有空位 | |
else { | |
// 但成員還沒去過該桌,將該桌已被分配的人踢出該桌,令其重新排隊,避免卡死 | |
if(!memberList[memberNum].includes(tmpTable)) { | |
// 移出桌子中第一位成員 | |
let outMember = curTableCnt[tmpTable].shift(); | |
// 移除成員記錄之桌位 | |
memberList[outMember].pop(); | |
// 將被移出的成員重新放回隊列 | |
memberQueue.push(outMember); | |
// 將新成員放入桌子 | |
curTableCnt[tmpTable].push(memberNum); | |
// 成員記錄所坐桌位 | |
memberList[memberNum].push(tmpTable); | |
// 因是換位,被踢出的人重新回到隊列,故 waitNum 不變 | |
// 成功分配(跳出迴圈) | |
isAssigned = true; | |
} | |
} | |
} | |
} | |
var inputRound = 5; | |
var inputMember = 50; | |
var inputTable = 5; | |
var inputMaxMemberPerTable = 10; | |
groupMember(inputRound, inputMember, inputTable, inputMaxMemberPerTable); | |
finalTable = []; | |
// 依照 member 記錄的桌位畫出每輪各桌的分佈 | |
for(var i=0; i<inputRound; i++) { | |
for(var j=0; j<memberLimit; j++) { | |
if(finalTable[i] == undefined) { | |
finalTable[i] = []; | |
} | |
if(finalTable[i][memberList[j][i]] == undefined) { | |
finalTable[i][memberList[j][i]] = []; | |
} | |
finalTable[i][memberList[j][i]].push(j); | |
} | |
} | |
// each member's table assignment | |
console.log(memberList); | |
// final table overview seperated by round | |
console.log(finalTable); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Output demo: