這裏的任何人在JS的解決方案的興趣https://jsfiddle.net/kp8d0w27/6/
第一個循環檢查是否與會者的總數可以平分。如果可以,就這樣做。
第二個循環只有在總數不是等分時纔會運行,並且將循環直到餘數(模)大於最小集並小於最大值。
最後,我使用稱爲塊的Lodash函數將原始數組拆分成相等部分。
const minNumber = 3
const maxNumber = 6
let divisible = false
let totalGroups = 0
let perGroup = 0
const attendees = ['chris', 'kevin', 'thomas', 'gio', 'nathan', 'michael', 'elyse', 'sarah', 'jacinthe', 'chloe', 'benoit', 'alex', 'darren', 'john']
const totalAttendees = attendees.length
// Can we divide into equal groups?
for (let divider = maxNumber; minNumber <= divider; divider--) {
totalGroups = totalAttendees/divider
if (Number.isInteger(totalGroups)) {
divisible = true
perGroup = divider
break
}
}
// Nope, so divide teams and make sure their between our min and max
if (!divisible) {
totalGroups = 0;
for (let j = maxNumber, remainder = 0; minNumber <= j; j--) {
remainder = totalAttendees % j
if (remainder >= minNumber && remainder <= maxNumber) {
perGroup = j;
break
}
}
}
console.log(JSON.stringify(_.chunk(attendees, perGroup)))
不乾淨(並有一些我沒有考慮在這裏,就像如果參加者的數量小於最小的情況下),我還在重構,但它運作良好,並解決了我的原問題。
您需要更加細緻的「更好」的定義。例如。如果目標是36,那麼更好? 12組3個,9組4個,6組6個, – Gene