Aujourd’hui on s’amuse ! Division euclidienne et distribution de graines…

J’avais un algorithme rigolo à faire aujourd’hui : ça revient à distribuer des graines qu’on a dans sa main, dans des petites cases (un peu comme un walé).

Pour économiser de nombreuses boucles ou de la récursivité, solution qui s’avèrerait bien lourde… j’ai cherché un moyen de calculer le nombre de graines à déposer dans les cases, avant même de les déposer, histoire de justement les déposer en une passe (c’est vrai quoi, PHP n’a pas que ça à faire non plus…)

La division euclidienne s’écrit : a = bq + r (a=graines, b=cases, q=quotient, r=reste).
Ex: 3 cases et 5 grainres.
5 = 3×1 + 2
On doit distribuer 1 graine dans chaque case (=quotient), il nous en restera 2, qu’on distribuera au 2 premières.
Pour distribuer ces 2 dernières, on en dépose 1 seule ds chq case, tant qu’il nous en reste.
On peut ainsi calculer d’un coup le nb de graines à déposer dans chaque case,
Pour chaque case : on pose la graine (quotient) et on pioche 1 graine dans le reste tant qu’il en reste.
Ca donne : 2, 2, 1

La fonction utilitaire donne donc ceci (avec un peu de debug quand meme, à adapter à votre sauce) :


function combienDeGrainesDistribuer($nbCases, $nbGraines) {
    $quotient = floor($nbGraines / $nbCases);
    $reste = $nbGraines % $nbCases;
    
    echo "\n- $nbCases, $nbGraines => $quotient, $reste";$aDristribuer = array();
    for ($i = 0; $i < $nbCases; $i++) { $supp = ($reste-- > 0) ? 1 : 0;
        $aDristribuer[$i] = $quotient + $supp;
    }
    
    var_dump($aDristribuer);
    
    return $aDristribuer;
}

// Quelques tests avec différents cas de figure :
getCombienDeGrainesDistribuer(10, 6);
getCombienDeGrainesDistribuer(5, 10);
getCombienDeGrainesDistribuer(5, 7);
getCombienDeGrainesDistribuer(1, 5);