mdk.fr/content/pages/python-parenthesons.md

3.2 KiB
Raw Blame History

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 lequipe « ASV », « Age^WAnalyse Syntaxique et Validation », vous travaillez sur le parenthésage des expressions :

  • (a + b) est valide.
  • )a + b( nest pas valide.
  • (a + (b + c)) est valide.
  • (a + (b + c) nest pas valide.
  • a * (b + c) + (d / 2) est valide…

Jusque-là ça va, mais Morecambe est un langage moderne, il ne sarrête pas aux mathématiques classiques, et permet dexprimer de la logique combinatoire, du lambda-calcul, de la sémantique dénotationnelle (en convergence et en divergence), et jen passe, ainsi :

  • (λa ∘ λb)(3) est valide, cest une simple composition des fonctions a et b, immédiatement appellée.
  • ⍼((a∘b)(3))|⍼((c∘d)(12)) est valide, cest 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) nest cependant PAS valide, bien quAugustus De Morgan aurait pu la corriger en un coup de cuiller à pot.

Votre première tâche sera donc dinventer un algorithme (quon 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 lexpression 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 :

Bonnes expressions :

```text
()
(((())))
()()()()
()(())()
(a + b)
(a + (b + c))
a * (b + c) + (d / 2)
(λa  λb)(3)
((ab)(3))|((cd)(12))

Mauvaises expressions :

text )( ((( ((() ())) ()()()( )a + b( (a + (b + c) [¬(a ⋀ b) ¬(c ⋀ d)] ∀ a⍼((c∘d)(12)

Dites, à quel point cest frustrant si je vous dis que ((())) écrit à lenvers ça donne )))((( ?

Partie Ⅱ

En rédigant votre algo vous remarquez un fait amusant : donné un certain nombre de paires de parenthéses, il ny a quun 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 savè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…