Tengo dos matrices de cadenas:
var array1 = ["word1", "word2", "word3", "word4", "word5", "word6"]; var array2 = ["word7", "word8"]; Necesito concatenar estas matrices en una nueva matriz y barajar los elementos en orden aleatorio. Sin embargo, los elementos de array2 deben repetirse dos veces en este nuevo array, y las repeticiones de un elemento dado deben tener al menos dos elementos de diferencia entre sí.
Aquí hay un resultado de ejemplo que satisface estas condiciones:
["word7", "word3", "word8", "word7", "word1", "word4", "word6", "word8", "word5", "word2"];Todos los elementos están en orden aleatorio y los elementos repetidos tienen al menos otros dos elementos entre ellos. ¿Cómo puedo escribir una función (sin usar bibliotecas adicionales, preferiblemente) que cree una matriz ordenada aleatoriamente que satisfaga las condiciones anteriores? Intenté extender los algoritmos de permutación estándar (por ejemplo, Fisher-Yates), pero me estoy tropezando con la implementación porque no estoy muy familiarizado con JS.
Cualquier ayuda muy apreciada - ¡gracias!
Lo más fácil probablemente sería hacerlo en dos pasos.
array1 con un algoritmo estándar de Fisher-Yates.Es decir, algo como lo siguiente (supongo que puede implementar fisher yates, por lo tanto, no lo incluí aquí y solo hice una copia (sin barajar) de la matriz)
let array1 = [1,2,3,4,5,6,7] let array2 = [8,9] let rand = (n) => Math.floor(Math.random()*n); //let shuffled = fisheryates(array1); let shuffled = array1.slice(); //just make a copy of the array while (array2.length) { let e = array2.splice(rand(array2.length), 1)[0]; let i1 = shuffled.length == 2 ? 0 : rand(shuffled.length + 1); let i2 = 0; do { i2 = shuffled.length == 2 ? 2 : rand(shuffled.length + 1); } while (Math.abs(i1 - i2) < 2) if (i1 < i2) { shuffled.splice(i2, 0, e); shuffled.splice(i1, 0, e); } else { shuffled.splice(i1, 0, e); shuffled.splice(i2, 0, e); } } console.log(shuffled)Como funciona:
Iterando sobre todos los elementos de array2 en orden aleatorio
obtienes un índice aleatorio para insertar el primer elemento. Si el shuffled tiene solo 2 elementos, los únicos índices válidos son 0 y 2 (porque esa es la única forma, que hay al menos dos elementos en el medio). Estoy usando shuffled.length + 1 aquí, porque eso permite insertar el elemento también al final de la matriz.
Luego, debe encontrar otro índice, que esté al menos a dos elementos del primer índice. El método más fácil (pero no necesariamente el más rápido) es probar hasta encontrar un índice.
Al insertar el elemento en la matriz, primero debe insertar el índice más grande, porque de lo contrario, el elemento superior estará en la posición incorrecta.
Si array1 solo tiene un elemento, necesita al menos dos elementos en array2 para poder generar una salida válida, pero puede hacerlo a mano como un caso especial.
let array1 = ['a'] let array2 = ['x', 'y', ...] let shuffled = ['x', 'y', 'a', 'x', 'y'] //or yxayx