On va empiler du sable ;) - Solution

On va empiler du sable ;) - Solution

On se retrouve aujourd'hui pour la solution du précédent #KataOfTheWeek proposé par M@xime en début de semaine !

La solution ici a été dévoloppée en typeScript.

/**
 * Ajouter une unité de sable à la pile
 * @param pile {number[][]} la pile à mettre à jour
 * @returns number[][], la pile à jour
 */
function addSand(pile: Array<Array<number>>): Array<Array<number>> {
    const middle = Math.ceil(pile.length / 2);
    // on ajoute l'unité au milieu de la pile
    pile[middle-1][middle-1]++;
    return processPile(pile);
}

/**
 * Mise à jour de la pile jusqu'à stabilisation
 * Si une cellule contient 4 unités ou plus, elle en perd 4
 * Les 4 unités sont réparties entre les plus proches voisin (au-dessus, en-dessous, à gauche, à droite)
 * Si une unités sort de la pile après la répartition elle est perdue
 * @param pile {number[][]}, la pile à process
 * @return {number[][]}, la pile stable
 */
function processPile(pile: Array<Array<number>>): Array<Array<number>> {
    let shouldUpdate;
    do {
        for (let i = 0; i < pile.length; i++) {
            shouldUpdate = false;
            const line = pile[i];
            for (let j = 0; j < line.length; j++) {
                if (line[j] >= 4){
                    shouldUpdate = true;
                    pile[i][j] -= 4;
                    if (i-1 >= 0){
                        pile[i-1][j]++;
                    }
                    if (i+1 < pile.length) {
                        pile[i+1][j]++;
                    }
                    if (j-1 >= 0) {
                        pile[i][j-1]++;
                    }
                    if(j+1 < pile.length) {
                        pile[i][j+1]++;
                    }
                }
            }
        }
    } while(shouldUpdate);
    return pile;
}

/*-----------------------------------------------------------*/
let pile1 = [
    [0,0,0],
    [0,0,0],
    [0,0,0]
];
addSand(pile1);
console.log("pile 1 : ", pile1); // [[0,0,0],[0,1,0],[0,0,0]]

let pile2 = [
    [0,0,0],
    [0,3,0],
    [0,0,0],
];
addSand(pile2);
console.log("pile 2 : ",pile2); // [[0,1,0],[1,0,1],[0,1,0]]

let pile3 = [
    [3,3,3],
    [3,3,3],
    [3,3,3],
];
addSand(pile3);
console.log("pile 3 : ", pile3); // [[1,3,1],[3,0,3],[1,3,1]]
/*-----------------------------------------------------------*/

A bientôt pour un nouveau #KataOfTheWeek !