Aller au contenu

Guide de l'IDE⚓︎

Exemple⚓︎

Un IDE se présente sous cette forme :

Enroulez-moi !

b1 = ['somme([]) == None', 'somme([1]) == 1', 'somme([1,2]) == 3', 'somme([-1,1]) == 0']bksl-nlb2 = ['sommation([1]) == 1', 'sommation([1,2]) == 3', 'sommation([-1,1]) == 0']bksl-nlbksl-nlbenchmark = (b1, b2)bksl-nl ∞/∞
def sommation(T: list) -> int:bksl-nl a = 0bksl-nl for nombre in T:bksl-nl a = a + nombrebksl-nl return abksl-nlbksl-nldef somme(L: list) -> None or int:bksl-nl return None if len(L) == 0 else sum(L)bksl-nldef somme(L: list[int]) -> int:bksl-nl return None if len(L) == 0 else sum(L)bksl-nl

Remarque sur la solution

C'est simple mais il faut être vigilant.

Une autre remarque est possible

Toujours simple mais toujours vigilant.

Il dispose de quatre boutons :

  • Lancer le script :
  • Télécharger le script :
  • Téléverser un script :
  • Valider le script avec des tests unitaires :

Rappel

Tout se fait du côté client. Rien n'est envoyé au serveur.

Prise en main⚓︎

Par défaut, la commande {{IDE('exo2')}} permet de charger un script placé dans docs/scripts/.

Organisation possible

Une page markdown regroupe de nombreux exercices.

Par exemple : {{IDE('chapitre1/exo2')}} chargera le script exo2.py depuis docs/scripts/chapitre1/.

AJOUTER UN EXEMPLE d'ARBORESCENCE

Une page markdown par exercice, comme indiqué dans mkdocs.yml. Dans ce cas, seul le chemin relatif depuis la position du fichier markdown dans l'arborescence est à indiquer.

Par exemple:

mkdocs.yml contient la ligne - "E-nsi 🏖": dentiste/sujet.md.

{{IDE('exo_dentiste')}} chargera le script exo_dentiste.py depuis docs/dentiste/.

AJOUTER UN EXEMPLE d'ARBORESCENCE

Important

Le bouton de validation du script à l'aide de tests unitaires est présent uniquement si vous fournissez un fichier nom_du_fichier_test.py présent dans le même répertoire que nom_du_fichier.py.

La solution apparait au bout de 5 tests unitaires si vous fournissez un fichier nom_du_fichier_corr.pydans le même répertoire que nom_du_fichier.py.

Le lancement du script, le téléchargement et le téléversement sont présentes par défaut.

Format de fichiers

Le script Python est écrit de manière classique.

Les librairies standards sont acceptés. Les annotations, même complexes, sont normalement acceptées : merci de me contacter si vous observez des comportements inattendus.

Le fichier Python de correction nom_de_script_corr.py est écrit de manière classique.

1
2
def somme(L: list[int]) -> int:
    return None if len(L) == 0 else sum(L)

Le fichier de juge en ligne doit contenir une variable appelée benchmark, de type list ou tuple :

1) Si l'on souhaite vérifier une unique fonction grâce à l'évaluateur de code :

1
benchmark = ['longueur([])==0', 'longueur([1,3,5,5])==4', 'longueur([0]*100)==100']

On a donc un tuple de chaînes de caractères qui sera évalué avec eval().

1) Si l'on souhaite vérifier plusieurs fonctions grâce à l'évaluateur de code :

1
2
3
4
b1 = ['somme([]) == None', 'somme([1]) == 1', 'somme([1,2]) == 3', 'somme([-1,1]) == 0']
b2 = ['sommation([1]) == 1', 'sommation([1,2]) == 3', 'sommation([-1,1]) == 0']

benchmark = (b1, b2)

On a donc un tuple de tableau de chaînes de caractères qui sera évalué avec eval().

Le fichier de juge en ligne peut être écrit de manière beaucoup plus "classique" en utilisant assert :

1
2
3
assert longueur_ajout([], []) == 0, 'longueur_ajout([], []) == 0'
assert longueur_ajout([1, 3, 5, 5],[]) == 4, 'longueur_ajout([1, 3, 5, 5],[]) == 4'
assert longueur_ajout([0]*100, [1]*20) == 120, 'longueur_ajout([0]*100, [1]*20) == 120'

Les assert sont directement évalués par Pyodide. Seul le test ayant échoué sera affiché. Les tests réussis n'afficheront rien.

Pas de problème pour tester autant de fonctions que nécessaire.

Conclusion

À condition que les fichiers *_corr.py et *_test.pysoient présents, {{IDE('foo/bar/truc/muche/fichier')}} gère tout seul :

  • l'énoncé,
  • le juge en ligne,
  • les fichiers de correction

Plein d'exercices !⚓︎

Exercices sur la longueur d'un tableau

Complétez la fonction longueur afin que celle-ci renvoie la taille d'un tableau L.

benchmark = ['longueur([])==0', 'longueur([1,3,5,5])==4', 'longueur([0]py-str100)==100']bksl-nl ∞/∞
L = [5,3,4,1]bksl-nlbksl-nldef longueur(L: list) -> int:bksl-nl return bksl-nldef longueur(L: list) -> int:bksl-nl return len(L)bksl-nl

Remarque

Ceci est un exemple complexe de remarque.

La première ligne du fichier de remarque doit être vide

La syntaxe markdown est complètement préservée. Par exemple, un tableau :

a b c
1 2 3

Une admonition ?

Vous pouvez inclure des admonitions et des superfences dans vos remarques.

Complétez la fonction longueur_ajout afin que celle-ci renvoie la taille de deux tableaux T1 et T2.

assert longueurpy-undajout([], []) == 0, 'longueurpy-undajout([], []) == 0'bksl-nlassert longueurpy-undajout([1, 3, 5, 5],[]) == 4, 'longueurpy-undajout([1, 3, 5, 5],[]) == 4'bksl-nlassert longueurpy-undajout([0]py-str100, [1]py-str20) == 120, 'longueurpy-undajout([0]py-str100, [1]py-str20) == 120'bksl-nl 5/5
T1 = [5,3,4,1]bksl-nlT2 = [1,2]bksl-nlbksl-nldef longueurpy-undajout(T1: list, T2: list) -> int:bksl-nl return bksl-nldef longueurpy-undajout(T1: list, T2: list) -> int:bksl-nl return len(T1) + len(T2)bksl-nl

Des admonitions en remarque

Yes, we can.

Oh yes, we can.

Toujours plus

Yes, we can.

Oh yes, we can.

Encore

Yes, we can.

Oh yes, we can.

On découpe une phrase à l'aide de l'instruction split.

Complétez la fonction nombre_mots afin que celle-ci renvoie le nombre de mots séparé par un espace d'une phrase phrase.

benchmark = ['nombrepy-undmots("Mon chien est beau.") == 4', 'nombrepy-undmots("") == 0', 'nombrepy-undmots("L\'esthète a des vices que la vertu ignore.") == 8']bksl-nl 5/5
adage = "Mon chien est beau."bksl-nlbksl-nldef nombrepy-undmots(phrase: str) -> int:bksl-nl # tableaupy-undmots = bksl-nl return bksl-nladage = "Mon chien est beau."bksl-nlbksl-nldef nombrepy-undmots(phrase: str) -> int:bksl-nl tableaupy-undmots = phrase.split(' ')bksl-nl return len(tableaupy-undmots) if len(phrase)>0 else 0bksl-nl

On peut bien sur enrouler tout cela...

Exercices sur la longueur d'un tableau

Complétez la fonction longueur afin que celle-ci renvoie la taille d'un tableau L.

benchmark = ['longueur([])==0', 'longueur([1,3,5,5])==4', 'longueur([0]py-str100)==100']bksl-nl ∞/∞
L = [5,3,4,1]bksl-nlbksl-nldef longueur(L: list) -> int:bksl-nl return bksl-nldef longueur(L: list) -> int:bksl-nl return len(L)bksl-nl

Remarque

Ceci est un exemple complexe de remarque.

La première ligne du fichier de remarque doit être vide

La syntaxe markdown est complètement préservée. Par exemple, un tableau :

a b c
1 2 3

Une admonition ?

Vous pouvez inclure des admonitions et des superfences dans vos remarques.

Complétez la fonction longueur_ajout afin que celle-ci renvoie la taille de deux tableaux T1 et T2.

assert longueurpy-undajout([], []) == 0, 'longueurpy-undajout([], []) == 0'bksl-nlassert longueurpy-undajout([1, 3, 5, 5],[]) == 4, 'longueurpy-undajout([1, 3, 5, 5],[]) == 4'bksl-nlassert longueurpy-undajout([0]py-str100, [1]py-str20) == 120, 'longueurpy-undajout([0]py-str100, [1]py-str20) == 120'bksl-nl 5/5
T1 = [5,3,4,1]bksl-nlT2 = [1,2]bksl-nlbksl-nldef longueurpy-undajout(T1: list, T2: list) -> int:bksl-nl return bksl-nldef longueurpy-undajout(T1: list, T2: list) -> int:bksl-nl return len(T1) + len(T2)bksl-nl

Des admonitions en remarque

Yes, we can.

Oh yes, we can.

Toujours plus

Yes, we can.

Oh yes, we can.

Encore

Yes, we can.

Oh yes, we can.

On découpe une phrase à l'aide de l'instruction split.

Complétez la fonction nombre_mots afin que celle-ci renvoie le nombre de mots séparé par un espace d'une phrase phrase.

benchmark = ['nombrepy-undmots("Mon chien est beau.") == 4', 'nombrepy-undmots("") == 0', 'nombrepy-undmots("L\'esthète a des vices que la vertu ignore.") == 8']bksl-nl 5/5
adage = "Mon chien est beau."bksl-nlbksl-nldef nombrepy-undmots(phrase: str) -> int:bksl-nl # tableaupy-undmots = bksl-nl return bksl-nladage = "Mon chien est beau."bksl-nlbksl-nldef nombrepy-undmots(phrase: str) -> int:bksl-nl tableaupy-undmots = phrase.split(' ')bksl-nl return len(tableaupy-undmots) if len(phrase)>0 else 0bksl-nl

Technique !⚓︎

Pour l'instant, j'ai la grosse flemme d'écrire cette section.

En quelques mots, on crée deux div désigné par un numéro auto-incrémenté :

  • <div id="editor_6"> crée la partie éditeur de texte. Ce div est converti en éditeur grâce à l'éditeur ACE ;
  • <div id="term_editor_6"> crée la partie Terminal. Le Terminal n'est créé qu'au moment de la validation du script ou du juge en ligne. Il est créé grâce au plugin Terminal de jQuery par converstion du div (voir section Guide du Terminal).
Retour en haut de la page