Skip to content

Instantly share code, notes, and snippets.

@samuelchou
Created October 17, 2023 09:20
Show Gist options
  • Save samuelchou/321d27cbfc184b26999b59530ce1bc74 to your computer and use it in GitHub Desktop.
Save samuelchou/321d27cbfc184b26999b59530ce1bc74 to your computer and use it in GitHub Desktop.
Group Function by Ryan Shanh
// 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);
@samuelchou
Copy link
Author

Output demo:

[
  [ 0, 4, 2, 1, 3 ], [ 4, 3, 0, 1, 2 ], [ 4, 0, 2, 1, 3 ],
  [ 3, 2, 0, 4, 1 ], [ 2, 1, 0, 4, 3 ], [ 1, 4, 0, 3, 2 ],
  [ 4, 0, 3, 1, 2 ], [ 4, 0, 3, 1, 2 ], [ 3, 0, 1, 2, 4 ],
  [ 1, 0, 2, 4, 3 ], [ 0, 4, 1, 2, 3 ], [ 3, 2, 1, 4, 0 ],
  [ 1, 3, 2, 4, 0 ], [ 0, 1, 4, 2, 3 ], [ 2, 3, 4, 0, 1 ],
  [ 0, 1, 3, 4, 2 ], [ 4, 1, 3, 2, 0 ], [ 3, 2, 4, 0, 1 ],
  [ 1, 4, 3, 0, 2 ], [ 0, 2, 4, 3, 1 ], [ 1, 2, 0, 3, 4 ],
  [ 3, 1, 4, 2, 0 ], [ 1, 0, 2, 3, 4 ], [ 0, 1, 4, 3, 2 ],
  [ 2, 1, 0, 3, 4 ], [ 4, 2, 0, 3, 1 ], [ 1, 2, 0, 4, 3 ],
  [ 3, 2, 1, 0, 4 ], [ 4, 3, 2, 0, 1 ], [ 3, 0, 2, 1, 4 ],
  [ 2, 4, 1, 3, 0 ], [ 0, 4, 3, 1, 2 ], [ 2, 4, 3, 1, 0 ],
  [ 3, 1, 2, 0, 4 ], [ 3, 0, 4, 2, 1 ], [ 1, 4, 0, 2, 3 ],
  [ 0, 3, 2, 4, 1 ], [ 4, 2, 1, 0, 3 ], [ 0, 4, 1, 3, 2 ],
  [ 2, 1, 3, 4, 0 ], [ 2, 4, 3, 0, 1 ], [ 0, 1, 4, 3, 2 ],
  [ 4, 3, 1, 2, 0 ], [ 3, 0, 4, 2, 1 ], [ 2, 0, 3, 1, 4 ],
  [ 4, 2, 0, 1, 3 ], [ 2, 3, 1, 0, 4 ], [ 1, 3, 2, 0, 4 ],
  [ 1, 3, 4, 2, 0 ], [ 2, 3, 1, 4, 0 ]
]
[
  [
    [
       0, 10, 13, 15, 19,
      23, 31, 36, 38, 41
    ],
    [
       5,  9, 12, 18, 20,
      22, 26, 35, 47, 48
    ],
    [
       4, 14, 24, 30, 32,
      39, 40, 44, 46, 49
    ],
    [
       3,  8, 11, 17, 21,
      27, 29, 33, 34, 43
    ],
    [
       1,  2,  6,  7, 16,
      25, 28, 37, 42, 45
    ]
  ],
  [
    [
       2,  6,  7,  8,  9,
      22, 29, 34, 43, 44
    ],
    [
       4, 13, 15, 16, 21,
      23, 24, 33, 39, 41
    ],
    [
       3, 11, 17, 19, 20,
      25, 26, 27, 37, 45
    ],
    [
       1, 12, 14, 28, 36,
      42, 46, 47, 48, 49
    ],
    [
       0,  5, 10, 18, 30,
      31, 32, 35, 38, 40
    ]
  ],
  [
    [
       1,  3,  4,  5, 20,
      24, 25, 26, 35, 45
    ],
    [
       8, 10, 11, 27, 30,
      37, 38, 42, 46, 49
    ],
    [
       0,  2,  9, 12, 22,
      28, 29, 33, 36, 47
    ],
    [
       6,  7, 15, 16, 18,
      31, 32, 39, 40, 44
    ],
    [
      13, 14, 17, 19, 21,
      23, 34, 41, 43, 48
    ]
  ],
  [
    [
      14, 17, 18, 27, 28,
      33, 37, 40, 46, 47
    ],
    [
       0,  1,  2,  6,  7,
      29, 31, 32, 44, 45
    ],
    [
       8, 10, 13, 16, 21,
      34, 35, 42, 43, 48
    ],
    [
       5, 19, 20, 22, 23,
      24, 25, 30, 38, 41
    ],
    [
       3,  4,  9, 11, 12,
      15, 26, 36, 39, 49
    ]
  ],
  [
    [
      11, 12, 16, 21, 30,
      32, 39, 42, 48, 49
    ],
    [
       3, 14, 17, 19, 25,
      28, 34, 36, 40, 43
    ],
    [
       1,  5,  6,  7, 15,
      18, 23, 31, 38, 41
    ],
    [
       0,  2,  4,  9, 10,
      13, 26, 35, 37, 45
    ],
    [
       8, 20, 22, 24, 27,
      29, 33, 44, 46, 47
    ]
  ]
]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment