Modifier

Kata - String Calculator

Kata string calculator est un kata incrémental. Il est décomposé en plusieurs parties qu'il faut faire les unes après les autres.

Attention, tant que cela n'est pas demandé, vous n'avez pas besoin de gérer des valeurs invalides.

Description

Etape 1 - Additionner 0, 1 ou 2 nombres

Vous devez créer une méthode calculate avec la signature suivante :

int calculate(string expression)

expression est une chaîne de caractères qui peut accepter 0, 1 ou deux nombres entiers séparés par une virgule. La méthode calculate doit renvoyer la somme de ces nombres.

Par exemple

calculate("0") // doit retourner 0
calculate("1") // doit retourner 1
calculate("153") // doit retourner 153
calculate("23,541") // doit retourner 564

La chaîne vide est un cas particulier. On doit retourner la valeur 0.

calculate("") // doit retourner 0`

Etape 2 - Additionner plusieurs nombres

Vous devez améliorer la méthode calculate pour que le paramètre expression puisse également recevoir plusieurs nombres

Par exemple

calculate("1,3,154") // doit renvoyer 158
calculate("100,30,24,2") // doit renvoyer 156

Astuce : vous avez terminé le développement lorsque vous exécutez calculate avec un nombre supplémentaire et que la fonction renvoie la bonne valeur

Etape 3 - Calculer sur plusieurs lignes

Les nombres du paramètre expression peuvent désormais être indiqués sur plusieurs lignes. La méthode calculate doit prendre en compte les retours chariots dans le calcul.

Par exemple

calculate("1\n2") // doit renvoyer 3
calculate("1,2\n3") // doit renvoyer 6
calculate("1\n2,4") // doit renvoyer 7

calculate("1,\n) // cette utilisation est invalide. Pour info, il ne faut pas gérer le fait que l'expression est invalide.

Etape 4 - Gérer les expressions invalides

Cette étape est facultative et peut être gérée plus tard. Cependant, traiter les expressions invalides à cette étape permet de simplifier la suite du kata.

Une expression est invalide lorsqu'un des éléments n'est pas un nombre. La méthode doit déclencher une exception dans ce cas.

Le message de l'exception est : "Invalid expression :" suivi de l'expression invalide.

Par exemple:

calculate("1,") // doit déclencher l'exception : Invalid expression : '1,'

Attention ! La chaîne vide est autorisée. On doit renvoyer 0 dans ce cas.

Etape 5 - Changer le délimiteur par défaut

On doit maintenant pouvoir changer le délimiteur par défaut (la virgule ,) par un autre délimiteur. Pour cela, on va autoriser la syntaxe suivante pour le paramètre expression. Cette nouvelle syntaxe est optionnelle :

//[delimiter]\n[numbers…]

Attention ! Toutes les précédentes expressions doivent toujours fonctionner.

Par exemple

calculate("//;\n1;2") // doit renvoyer 3
calculate("//;\n1;2\n3") // doit renvoyer 6
calculate("//;\n102") // doit renvoyer 102
calculate("//@\n10@20@30") // doit renvoyer 60

// Les précédentes expressions doivent toujours fonctionner
calculate("1,2") // doit renvoyer 3

calculate("//;\n102,5") // cette utilisation est invalide. Le séparateur par défaut est ; et non plus ,

Etape 6 - Détecter les nombres négatifs

La méthode calculate doit désormais déclencher une exception quand expression contient un ou plusieurs nombres négatifs.

Le message de l'exception sera negatives not allowed: suivi de la liste des nombres négatifs.

Par exemple :

calculate("1,-2") // doit déclencher l'exception : negatives not allowed: -2
calculate("5,-4,1,-2") // doit déclencher l'exception : negatives not allowed: -4, -2

Etape 7 - Ignorer les nombres supérieurs à 1000

La méthode calculate doit ignorer les nombres supérieurs à 1000.

Par exemple :

calculate("1000") // doit renvoyer 1000
calculate("1001") // doit renvoyer 0
calculate("54,1020") // doit renvoyer 54

Etape 8 - Délimiteur de taille variable

Le délimiteur personnalisé peut désormais être de n'importe quelle taille grâce à la syntaxe suivante :

//{[delimiter]}\n[numbers]

Attention, la syntaxe précédente doit toujours fonctionner.

Par exemple :

calculate("//{***}\n5***20") // doit renvoyer 25 (séparateur de 3 caractères)
calculate("//{*}\n5*20") // doit renvoyer 25 (séparateur de 1 caractère)
calculate("//*\n5*20") // doit renvoyer 25 (syntaxe précédente)

Etape 9 - Plusieurs délimiteurs

Il peut désormais y avoir plusieurs délimiteurs personnalisés grâce à la syntaxe suivante

//{[delimiter 1]}{[delimiter 2]}\n[numbers]

Par exemple :

calculate("//{%}{**}\n5%2*3") // doit renvoyer 13

Etape 10 - Plusieurs délimiteurs de taille variable

Les délimiteurs personnalisés peuvent désormais être de n'importe quelle taille grâce à la syntaxe suivante :

//{[delimiter 1]}{[delimiter 2]}\n[numbers]

Référence