La suite de Conway

Cette semaine, c'est Lothaire qui vous propose un #KataOfTheWeek : La suite de Conway

Briefing du Kata : Le but de ce kata est de développer une fonction qui retourne les n premières lignes de la suite de Conway.
Pour déterminer un terme de la suite, il faut prendre le terme précedent et le lire en indiquant combien de fois chacun de ses chiffres se répète.
Le premier terme de la suite est fixé à 1.
Le deuxième terme de la suite s'obtient donc en lisant le premier terme : "un 1" ce qui donne donc 11.
Le troisième terme s'obtient en lisant le deuxième terme : "deux 1" ce qui donne donc 21.
Le quatrième terme s'obtient en lisant le troisième terme : "un 2 et un 1" ce qui donne donc 1211.
Et ainsi de suite …
Vous avez compris ? Alors, à vous de jouer !!

P.S. :
Voici les 10 premiers termes de la suite :
[1, 11, 21, 1211, 111221, 312211, 13112221, 1113213211, 31131211131221, 13211311123113112211]

Saurez-vous résoudre le problème ?

Bon courage !


Et voici une solution proposée par l'auteur en Java :

public class ConwaySequence {

    public List<String> getConwaySequence(int n) {
        if (n == 0) {
            throw new IllegalStateException();
        }

        List<String> conwaySequence = new ArrayList<>();

        // Add first term
        String FIRST_TERM = "1";
        conwaySequence.add(FIRST_TERM);

        // Add other terms
        for (int rowIndex = 0; rowIndex < n - 1; rowIndex++) {
            String previousRow = conwaySequence.get(rowIndex);
            int previousRowLength = previousRow.length();

            StringBuilder currentRow = new StringBuilder();

            int numberOfMatchingChars = 1; // Initialize count of matching chars
            char []arr = previousRow.toCharArray();

            // Process previous term to find the next term
            for (int i = 0; i < previousRowLength - 1; i++) {
                if (arr[i] == arr[i + 1]) { // If current char matches next char
                    numberOfMatchingChars++; // then increment count of matching characters
                } else { // If current char doesn't match next char
                    currentRow.append(numberOfMatchingChars); // Append number of matching chars
                    currentRow.append(arr[i]); // Append current char

                    numberOfMatchingChars = 1; // Reset counter
                }
            }
            // For the last char
            currentRow.append(numberOfMatchingChars); // Append number of matching chars
            currentRow.append(arr[previousRowLength - 1]); // Append current char

            conwaySequence.add(currentRow.toString());
        }

        return conwaySequence;
    }
}

Votre équipe TakiVeille