0
votes

Tableau divisé en morceaux de longueurs aléatoires entre une plage donnée

J'ai besoin d'aide ici s'il vous plaît.
Donc j'ai le tableau suivant: xxx pré>

J'essaie de diviser ce tableau en morceaux avec des longueurs entre une plage donnée p> xxx pré>

donc le La taille du morceau peut être n'importe quoi entre Minchunksize code> et maxchunksize code> généré aléatoirement. p>

sorties possibles: p>

[[1, 2, 3], [4, 5, 6, 7], [8, 9, 10]]
or
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
or
[[1, 2], [3, 4, 5, 6, 7], [8, 9, 10]]
or
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]

etc...


0 commentaires

3 Réponses :


1
votes

Une fonction récursive fera le travail: xxx


0 commentaires

4
votes

Ceci est un peu inefficace, mais vous pouvez créer une méthode récursive qui progressivement tranche () strong> Un nombre aléatoire (entre certains min code> et max code>) des éléments du déployer. Si le résultat final généré a () strong> matrice avec une longueur inférieure au minimum, puis la méthode se rappellera elle-même.

p>

.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}


1 commentaires

Ouais, est venu avec presque la même solution.



2
votes

Même si ce n'est pas la solution la plus efficace, vous pouvez essayer de générer les morceaux et si le dernier élément est plus court que la valeur requise minimale, vous essayez de le générer à nouveau (récursivité) comme:

P>

const generate = (input, min, max) => {
  const random = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
  
  const inner = arr => {
    if (arr.length === 0) return;
    
    const minIndex = arr.length < min ? arr.length : min;;
    const maxIndex = arr.length < max ? arr.length : max;
    
    const splitIndex = random(minIndex, maxIndex);
    
    const generatedArray = arr.slice(0, splitIndex);
    const remainingArray = arr.slice(splitIndex);
    
    if (remainingArray.length === 0) {
      return [generatedArray];
    } else {
      return [generatedArray].concat(inner(remainingArray));
    }
  };
  
  const result = inner(input);
  return result.every(item => item.length >= min) ? result : generate(input, min, max);
};

console.log(
  generate(
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    2,
    4,
  )
);


0 commentaires