status: hidden title: Algo Avancé — Parenthésons slug: iej2Aepe-parenthesons robots: noindex # Partie Ⅰ Après Epitech Digital, et un doctorat en informatique vous rejoignez une équipe chargée de concevoir le prochain langage de programmation à la mode : le Morecambe. Dans l’equipe « ASV », « Age^WAnalyse Syntaxique et Validation », vous travaillez sur le parenthésage des expressions : - `(a + b)` est valide. - `)a + b(` n’est pas valide. - `(a + (b + c))` est valide. - `(a + (b + c)` n’est pas valide. - `a * (b + c) + (d / 2)` est valide… Jusque-là ça va, mais Morecambe est un langage moderne, il ne s’arrête pas aux mathématiques classiques, et permet d’exprimer de la logique combinatoire, du lambda-calcul, de la sémantique dénotationnelle (en convergence et en divergence), et j’en passe, ainsi : - `(λa ∘ λb)(3)` est valide, c’est une simple composition des fonctions `a` et `b`, immédiatement appellée. - `⍼((a∘b)(3))|⍼((c∘d)(12))` est valide, c’est le « Right Angle with Downwards ZigZag Arrow » qui permet la dénotation (divergente, pour le coup), le `|` ne servant qu’à chaîner, comme en bash, naturellement. - `[¬(a ⋀ b) ⋁ ¬(c ⋀ d)] ∀ a⍼((c∘d)(12)` n’est cependant **PAS** valide, bien qu’[Augustus De Morgan](https://fr.wikipedia.org/wiki/Lois_de_De_Morgan) aurait pu la corriger en un coup de cuiller à pot. Votre première tâche sera donc d’inventer un algorithme (qu’on pourra rédiger en Morecambe une fois le compilateur Morecambe fonctionnel), nommé `is_correctly_balanced` qui prend en paramètre une chaîne de caractères nommée `expression`, et qui renvoie vrai si l’expression est correctement paremthésée, et faux dans le cas contraire. L’équipe vous a préparé des specs sur une nappe en papier tachée d'huile pimentée : ```python Bonnes expressions : ```text () (((()))) ()()()() ()(())() (a + b) (a + (b + c)) a * (b + c) + (d / 2) (λa ∘ λb)(3) ⍼((a∘b)(3))|⍼((c∘d)(12)) ``` Mauvaises expressions : ``text )( ((( ((() ())) ()()()( )a + b( (a + (b + c) [¬(a ⋀ b) ⋁ ¬(c ⋀ d)] ∀ a⍼((c∘d)(12) `` Dites, à quel point c’est frustrant si je vous dis que `((()))` écrit à l’envers ça donne `)))(((` ? # Partie Ⅱ En rédigant votre algo’ vous remarquez un fait amusant : donné un certain nombre de paires de parenthéses, il n’y a qu’un nombre fini de possibilités pour les agencer. Vous ne pouvez donc vous retenir de griffonner un algo qui permet de tous les lister ! Votre algo, `gen_correctly_balanced_expressions` prend un seul parametre `n` : le nombre de paires de parenthéses. Elle doit renvoyer tous les parenthésages possibles, chaque parenthésage étant une chaîne de caractères. Voici par exemple les 14 parenthésages valides avec quatres paires de parenthéses : - `(((())))` - `((()()))` - `(()(()))` - `(()()())` - `((())())` - `()((()))` - `()(()())` - `()()(())` - `()()()()` - `()(())()` - `(())(())` - `(())()()` - `((()))()` - `(()())()` Cet algorithme s’avèrera très utile par la suite : vos collègues ont déjà l'idée de l'utiliser pour tester votre premier algo. Mais il faudra attendre l'implémentation en Morecambe pour ça…