Parenthésons !
This commit is contained in:
parent
84c1f4e668
commit
8e385cf757
|
@ -0,0 +1,115 @@
|
|||
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…
|
Loading…
Reference in New Issue