Quería hacer un pequeño script en js que tenga una lista de usuarios, un usuario tiene que hacer un regalo a otro.
Aplicando las siguientes restricciones:
Si "a" es el papa noel y le da un regalo a "c" no puede ser al revés. Entonces "c" no puede ser el Papá Noel de "a".
Debe funcionar con un número par e impar de usuarios.
En su opinión, ¿cuál podría ser el enfoque correcto para intentar minimizar el número de comparaciones, es decir, acelerar el script?
Estaba pensando en algo como esto para empezar, pero después no estoy seguro de cómo proceder:
let name = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; let a = [...name]; let group1 = []; let groupSanta = []; let groupUser = []; for (var i = 0; i < name.length / 2 - 1; i++) { let santaClaus = a[Math.floor(Math.random() * a.length)]; a = a.filter(item => item !== santaClaus); let user = a[Math.floor(Math.random() * a.length)]; a = a.filter(item => item !== user); group1.push({ santaClaus, user }); } console.log(a, group1);Puede ordenar aleatoriamente la matriz y asignar a cada persona a la siguiente. Luego asigne la primera persona a la última en la matriz
// Define names const names = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; // Function to shuffle array const shuffle = (arr) => { for (let i = arr.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [arr[i], arr[j]] = [arr[j], arr[i]]; } return arr; } const randomNames = shuffle(names); // Match each person with the next one, folding over at the end const matches = randomNames.map((name, index) => { return { santa: name, receiver: randomNames[index + 1] || randomNames[0], } }); console.log(matches); let players = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; players = shuffleArray(players) const matches = players.map((name, index) => { return { santa: name, receiver: players[index + 1] || players[0], } }); function shuffleArray(array) { let currentIndex = array.length, randomIndex while (currentIndex != 0) { randomIndex = Math.floor(Math.random() * currentIndex) currentIndex-- [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]] } return array } console.log(matches)