Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

127
Views
Mezclar matrices de cadenas en JavaScript con elementos repetidos que estén al menos separados por dos elementos

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!

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Lo más fácil probablemente sería hacerlo en dos pasos.

  1. Shuffle array1 con un algoritmo estándar de Fisher-Yates.
  2. Inserte los elementos en posiciones aleatorias que cumplan las condiciones.

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
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!