Parenthesons.

This commit is contained in:
Julien Palard 2022-04-14 23:35:50 +02:00
parent 334241f26a
commit 319ce1e7e0
2 changed files with 89 additions and 7 deletions

View File

@ -0,0 +1,81 @@
status: hidden
title: Python — Parenthésons
slug: Az6quieP-parenthesons
robots: noindex
Vous voila 7 ans après Sup'Internet^WEpitech Digital, après votre
doctorat en informatique. En tant que post-doc vous rejoignez une
équipe, dans un labo de recherche, chargée de concevoir le prochain
langage de programmation à la mode : Le Morecambe.
Dans lequipe « analyse 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 avec `3` comme seul
argument.
- `⍼((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 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 dans léquipe ASV (Age^WAnalyse Syntaxique &
Validation), sera donc décrire lalgorithme qui valide le
parenthésage des expressions Morecambiennes.
Lanalyse syntaxique ayant déjà été implémentée par léquipe, votre
première tâche sera heureusement très simple :
Vous vous occuperez de la fonction `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.
La chaine de caractere, `expression`, nest heureusement pas une
expression Morecambienne complète, le reste ayant déjà été analysé, ce
qui est donné à votre fonction `is_correctly_balanced` ne contient que
des `(` et des `)`, cest tout.
Ce qui permettra à votre équipe de rapidement écrire des tests
unitaires et de non-régression pour garantir la qualité de votre
travail, et ainsi la stabilité du Morecambe, comme :
- is_correctly_balanced("") est vrai
- is_correctly_balanced("()") est vrai
- is_correctly_balanced("(((())))") est vrai
- is_correctly_balanced("()()()()") est vrai
- is_correctly_balanced("()(())()") est vrai
- is_correctly_balanced(")(") est faux
- is_correctly_balanced("(((") est faux
- is_correctly_balanced("((()") est faux
- is_correctly_balanced("()))") est faux
- is_correctly_balanced("()()()(") est faux
- etc, etc...
En passant, cest frustrant si je vous dis que `((()))` écrit à
lenvers ca donne `)))(((` ?
Rendu : Vous pouvez bien-sur écrire cet exercice dans le langage de
votre choix, dans un langage inventé, en Morecambe, en pseudocode,
dans un mélange de pseudocode et dun langage qui vous plaît, peu
importe, tant que jen comprends la logique (ayant pratiqué le
brainf*ck, le Prolog, le LISP, et lErlang, si je ne comprends pas
votre rendu, je saurai qui blamer).

View File

@ -8,7 +8,7 @@ robots: noindex
Après Epitech Digital, et un doctorat en informatique vous rejoignez
une equipe chargée de concevoir le prochain langage de programmation à
une équipe chargée de concevoir le prochain langage de programmation à
la mode : le Morecambe.
Dans lequipe « ASV », « Age^WAnalyse Syntaxique et Validation », vous
@ -42,7 +42,7 @@ fonctionnel, pour compiler Morecambe en Morecambe et boucler la
boucle, en attendant, on code en Python). Une fonction nommée
`is_correctly_balanced` qui prend en paramètre une chaîne de
caractères nommée `expression`, et qui renvoie `True` si lexpression
est correctement paremthéséee, et `False` dans le cas
est correctement paremthésée, et `False` dans le cas
contraire.
Léquipe vous a préparé quelques tests unitaires et vous aurez la
@ -74,7 +74,7 @@ def test_full():
```
Dites, à quel point cest frustrant si je vous dis que `((()))` écrit
à lenvers çax donne `)))(((` ?
à lenvers ça donne `)))(((` ?
# Partie Ⅱ
@ -83,7 +83,7 @@ En rédigant votre fonction 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 dimplementer une fonction pour tous les
Vous ne pouvez donc vous retenir dimplementer une fonction pour toutes les
lister !
Votre fonction doit sappeler `gen_correctly_balanced_expressions` et
@ -95,8 +95,9 @@ chaque parenthésage étant exprimé sous la forme dune chaine de
caractères. Vous devinerez vite quil nexiste quune seule manière de
parenthéser une seule paire de parenthéses, puis vous découvrirez
quil existe
- deux manieres de parenthéser deux paires,
- 5 manieres den parenthéser trois,
- deux manières de parenthéser deux paires,
- 5 manières den parenthéser trois,
- 14 den parenthéser 4,
- ...
- 4862 den parenthéser 9...
@ -164,7 +165,7 @@ Du binaire… des nombres ! Et aucun ne commence par zéro !! Et ils
sont tous pairs ! Ça ne peut pas être une coïncidence…
Vous rédigez alors une fonction `gen_balanced_sequence` qui prend en
paramètre `n`, le nombre de pairs de bits à utiliser, et qui renvoie
paramètre `n`, le nombre de paires de bits à utiliser, et qui renvoie
un iterable de nombres entiers ordonnés par ordre croissant : les
nombres genérés par votre expérience précédente. Ces séquences sont
interessantes, mais trop courtes :