Ce kata va révolutionner la manière dont vous codez ! - Solution

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

La solution que je propose consiste à prendre le nombre le plus bas, et à le descendre. Dans le cas de la première colonne, c'est assez simple, le 2 "tombe" en bas.
Ensuite, si un nombre tombe sur un autre nombre, il faut les faire s'additionner. C'est pourquoi dans la deuxième colonne, on additionne les deux 2 pour en faire un 4. C'est aussi pourquoi je commence par le nombre le plus bas : sinon, ce seront les mauvais 2 qui s'additionneront et le résultat en serait différent.
La colonne 3 possède une difficulté supplémentaire : les nombres vont s'additionner en tombant mais ne doivent pas continuer à s'additionner avec le 8 tout en haut. Pour cela, la solution que j'ai choisit est de créer un tableau supplémentaire qui retient quels nombres ont été additionnés de façon à ne pas les additionner de nouveau.
La colonne 4 quant à elle reprend toutes les difficultés des autres colonnes et est un bon test pour voir si l'algorithme fonctionne bien.

Exemple :

|   |   | 8 | 2 |  
|   | 2 |   | 2 |  
| 2 | 2 | 4 | 2 |  
|   | 2 | 4 | 2 |  

        |  
        V  

|   |   |   |   |  
|   |   |   |   |  
|   | 2 | 8 | 4 |  
| 2 | 4 | 8 | 4 |  
    public static void moveDownward(int [][] board) {
        boolean [][] hasAlreadyBeenAdded = new boolean[4][4];
        for (int column = 0; column < board[0].length; column++) {
            for (int row = board.length - 1; row >= 1; row--) {
                if ((board[row][column] == board[row - 1][column]) && board[row][column] != 0 && hasAlreadyBeenAdded[row][column] != true && hasAlreadyBeenAdded[row - 1][column] != true) {
                    // Sum 2 adjacent numbers
                    board[row][column] = board[row][column] + board[row - 1][column];
                    board[row - 1][column] = 0;
                    hasAlreadyBeenAdded[row][column] = true;
                    row = board.length - 1;
                }

                if (board[row][column] == 0 && board[row - 1][column] != 0) {
                    // Drop the number down
                    board[row][column] = board[row - 1][column];
                    board[row - 1][column] = 0;
                    hasAlreadyBeenAdded[row][column] = hasAlreadyBeenAdded[row - 1][column];
                    row = board.length;
                }
            }
        }
    }

A bientôt pour un nouveau #KataOfTheWeek !

TakiVeille

TakiVeille