Skip to content

Instantly share code, notes, and snippets.

@io-developer
Last active April 14, 2020 19:19
Show Gist options
  • Save io-developer/06a5554d504d57b155403511ee64f4b0 to your computer and use it in GitHub Desktop.
Save io-developer/06a5554d504d57b155403511ee64f4b0 to your computer and use it in GitHub Desktop.
function secretSanta(values, mutualEnabled = true) {
var indexes = [];
indexes.length = values.length;
indexes = indexes.fill(0)
.map((v, i) => { return {index: i, order: Math.random()} })
.sort((a, b) => a.order - b.order)
.map(item => item.index)
;
var fraglen = left => {
let count = Math.max(2, Math.ceil(left * Math.random()));
return mutualEnabled && left - count > 1 ? count : left;
};
var result = [];
while (indexes.length > 0) {
indexes.splice(0, fraglen(indexes.length)).forEach((index, i, fragment) => {
result.push({
source: values[index],
target: values[fragment[(i + 1) % fragment.length]],
});
});
}
return result;
}
console.log('secretSanta mutual ON', secretSanta(['Alice', 'Bob', 'Craig', 'Dave', 'Eve']));
console.log('secretSanta mutual OFF', secretSanta(['Alice', 'Bob', 'Craig', 'Dave', 'Eve'], false));
/*
secretSanta mutual ON [
{ source: 'Alice', target: 'Eve' },
{ source: 'Eve', target: 'Craig' },
{ source: 'Craig', target: 'Alice' },
{ source: 'Bob', target: 'Dave' },
{ source: 'Dave', target: 'Bob' }
]
secretSanta mutual OFF [
{ source: 'Bob', target: 'Craig' },
{ source: 'Craig', target: 'Eve' },
{ source: 'Eve', target: 'Alice' },
{ source: 'Alice', target: 'Dave' },
{ source: 'Dave', target: 'Bob' }
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment