Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

249
Vistas
loop arrojó una matriz de matrices en recursividad (problema de algoritmo)

Quiero crear una función que se conozca con mayor frecuencia en las fábricas. Tipo de sistema de rotación, donde las personas cambian de estación, mientras que otros están en un descanso.

a través de DragnDrop, creo/agrego/actualizo un mapa y convierto este mapa en una matriz de matrices como esta:

 let example1 = [ ['John', ['99', '1']], ['Jo', ["1", "3"]], ["Alpha", ["99", "4"]], ["Beta", ["3", "2"]], ["Gamma", ["2", "99"]], ["Delta", ["4", "5"]], ["Maria", ["5", "6"]], ["Epsilon", ["6", "99"]], ];

el primer número es para la posición anterior , el segundo número es para la nueva posición. El número 99 significa estar de descanso. la salida para el ejemplo anterior debería ser algo como:

 outputExample1 = [ ["John", "1", "3", "2"], ["Alpha", "4, "5", "6"] ]

por lo tanto, cada secuencia y recursión debe comenzar con un interruptor (= número 99) y terminar con un interruptor. en el ejemplo anterior: después de colocar "john" en la estación uno, debería "buscar" dónde está "ahora" el chico/la chica de la estación 1. en este ejemplo, él está en 3. ahora busca de nuevo donde está ahora el de la estatina 3. (=2) ... hasta que el número sea 99, que es el caso en este ejemplo. es por eso que comencé a filtrar la matriz original en 'activ' (<99) y 'breakers' (== 99). Intenté de muchas maneras y fallé continuamente (mientras que los bucles terminan en un bucle sin fin, las salidas son totalmente incorrectas), porque no encuentro una buena recursividad.

Cualquier sugerencia es muy apreciada.

PD: tenga en cuenta que la matriz anterior está "terminada" para proporcionar un buen ejemplo y es posible que no se complete sobre la marcha (mediante arrastrar y soltar). Significado: si empiezo a arrastrar, la secuencia seguramente no se completará.

Editar: seguro que habrá al menos UN '99'. si no, no hay secuencia ni salida. Además, no hay duplicados en la 'nueva posición' excepto 99er. (que son los titulares de todos modos

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Podría adoptar un enfoque secuencial y visitar todos los nodos en el orden que tiene. Luego tome una propiedad anidada para la mayoría de los elementos superiores y mantenga la relación con los nodos. Al final, devuelva solo los nodos superiores.

Si es necesario, tome las entradas del resultado para una matriz de pares clave/valor.

 const data = [['John', ['99', '1']], ['Jo', ["1", "3"]], ["Alpha", ["99", "4"]], ["Beta", ["3", "2"]], ["Gamma", ["2", "99"]], ["Delta", ["4", "5"]], ["Maria", ["5", "6"]], ["Epsilon", ["6", "99"]]], relations = data .reduce((r, [top, [from, to]]) => { if (to === '99') return r; if (from === '99') { r[to] = r.top[top] = [to]; } else { r[from].push(to); r[to] = r[from]; } return r; }, { top: {} }) .top; console.log(relations);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

Versión sin reduce .

 const data = [['John', ['99', '1']], ['Jo', ["1", "3"]], ["Alpha", ["99", "4"]], ["Beta", ["3", "2"]], ["Gamma", ["2", "99"]], ["Delta", ["4", "5"]], ["Maria", ["5", "6"]], ["Epsilon", ["6", "99"]]], temp = {}, relations = {}; for (const [top, [from, to]] of data) { if (to === '99') continue; if (from === '99') { temp[to] = relations[top] = [to]; } else { temp[from].push(to); temp[to] = temp[from]; } } console.log(relations);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

about 4 years ago · Juan Pablo Isaza Denunciar

0

La respuesta de Nina está bien, siempre que sus datos siempre estén ordenados como en el ejemplo. Si no, entonces esto podría ayudar:

 const cycleUntil = (schedule, x, [_, [f, t]] = schedule .find (([_, [f]]) => x == f)) => f == 99 ? [] : [f, ... cycleUntil (schedule, t)] const transform = (schedule) => schedule .filter (([n, [f]]) => f == '99') .map (([n, [f, t]]) => [n, ... cycleUntil (schedule, t)]) const example1 = [['John', ['99', '1']], ['Jo', ["1", "3"]], ["Alpha", ["99", "4"]], ["Beta", ["3", "2"]], ["Gamma", ["2", "99"]], ["Delta", ["4", "5"]], ["Maria", ["5", "6"]], ["Epsilon", ["6", "99"]] ] console .log (transform (example1)) const example2 = [...example1, ["Zeta", ["99", "7"]], ["Eta", ["7", "10"]], ["Theta", ["8", "99"]], ["Iota", ["9", "8"]], ["Kappa", ["10", "9"]]] console .log (transform (example2))
 .as-console-wrapper {max-height: 100% !important; top: 0}

Aquí, nuestra función de transform encuentra todos los elementos que comienzan con '99' y devuelve el nombre asociado con ellos junto con el resultado de llamar a la función cycleUntil , que toma una estación y el horario completo y devuelve una matriz que incluye esa estación y, recursivamente, el elemento con el que to en su posición from origen.

Esto fallará si los datos no se construyen correctamente. Es casi seguro que necesitaría alguna verificación de errores para asegurarse de que los datos estén completos. Pero lo dejaré como ejercicio.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda