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