cours_NSI/search/search_index.json

1 line
65 KiB
JSON

{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Terminal et IDE dans Mkdocs \u2693\ufe0e Introduction \u2693\ufe0e Pyodide-Mkdocs est une solution technique permettant de cr\u00e9er un cours interactif \u00e0 partir d'un site g\u00e9n\u00e9r\u00e9 par Mkdocs. Il permet d'int\u00e9grer, dans le navigateur, c\u00f4t\u00e9 client : une console Python ; un \u00e9diteur de code ; un juge en ligne associ\u00e9 \u00e0 des corrig\u00e9s. Garantie : sans cookie sans inscription cr\u00e9\u00e9 par un enseignant pour les enseignants Solution La technologie permettant ce tour de force s'appelle Pyodide . Pyodide utilise WebAssembly pour faire le lien entre Python et Javascript et proposer un environnement permettant de manipuler le DOM avec Python, ou de manipuler Python avec Javascript. Aper\u00e7u \u2693\ufe0e Lancer # testsbksl-nlbksl-nlassert dentiste(\"j'ai mal\") == 'aia'bksl-nlassert dentiste(\"il fait chaud\") == 'iaiau'bksl-nlassert dentiste(\"\") == ''bksl-nlbksl-nlbksl-nl# pas d'autres testsbksl-nlbksl-nlassert dentiste(\"a\"py-str20 + \"b\"py-str10 + \"e\") == 'a'py-str20 + 'e'bksl-nlassert dentiste(\"b\"py-str10 + \"e\" + \"a\"py-str20) == 'e' + 'a'py-str20 bksl-nlassert dentiste(\"ab\"py-str10) == 'a'py-str10bksl-nlassert dentiste(\"aeiouy\"py-str10) == 'aeiouy'py-str10bksl-nlassert dentiste(\"z\"py-str100 + 'y') == 'y'bksl-nlbksl-nl Valider 5/5 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder voyelles = ['a', 'e', 'i', 'o', 'u', 'y']bksl-nlbksl-nldef dentiste(texte):bksl-nl passbksl-nlbksl-nlassert dentiste(\"j'ai mal\") == 'aia'bksl-nlassert dentiste(\"il fait chaud\") == 'iaiau'bksl-nlassert dentiste(\"\") == ''bksl-nlbksl-nl voyelles = ['a', 'e', 'i', 'o', 'u', 'y']bksl-nlbksl-nldef dentiste(texte):bksl-nl resultat = ''bksl-nl for lettre in texte:bksl-nl if lettre in voyelles:bksl-nl resultat = resultat + lettrebksl-nl return resultatbksl-nlbksl-nl A Une premi\u00e8re remarque Ceci est un exercice classique. D'autres d\u00e9tails On pourrait repr\u00e9senter la situation dans un tableau : a b c 1 2 3 Z Installation \u2693\ufe0e On part d'une installation comme indiqu\u00e9 sur [https://ens-fr.gitlab.io/mkdocs/] avec le plugin macro , pr\u00e9alablement install\u00e9. L'installation demande de rajouter \u00e0 cette configuration les \u00e9l\u00e9ments suivants. Modification : fichier YML mkdocs.yml ; fichier de macro main.py ; Ajout : un dossier my_theme_customizations/ \u00e0 la racine du projet Mkdocs ; un template HTML my_theme_customizations/main.html ; un fichier CSS docs/xtra/stylesheets/pyoditeur.css ; deux fichiers Javascript docs/xtra/javascripts/interpreter.js et my_theme_customizations/js/ide.js ; deux fichiers Markdown docs/xtra/start.md et docs/xtra/end.md . Fichier YML mkdocs.yml \u2693\ufe0e Ajoutez les lignes surlign\u00e9es dans votre fichier mkdocs.yml . site_name : \"Terminal et REPL dans Mkdocs\" ... theme : name : material custom_dir : my_theme_customizations/ ... extra_javascript : - xtra/javascripts/mathjax-config.js # MathJax - javascripts/config.js - https://polyfill.io/v3/polyfill.min.js?features=es6 - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js - xtra/javascripts/interpreter.js extra_css : - xtra/stylesheets/pyoditeur.css - xtra/stylesheets/ajustements.css # ajustements Fichier macro Python main.py \u2693\ufe0e \u00c0 votre fichier main.py , ajoutez les lignes du fichier main.py . Cr\u00e9ation du dossier custom_dir \u2693\ufe0e N'oubliez pas de cr\u00e9er le dossier my_theme_customizations/ \u00e0 la racine du projet Mkdocs . Dans ce dossier, ajoutez le template Jinja main.html : {% extends \"base.html\" %} {% block content %} {{ super () }} <script src=\" {{ base_url }} /js/ide.js\"></script> {% endblock %} {% block libs %} {{ super () }} <!-- favicons --> <link rel=\"shortcut icon\" href=\"../assets/images/favicon.ico\" type=\"image/x-icon\"> <link rel=\"icon\" href=\"../assets/images/favicon_32x32.png\" sizes=\"32x32\"> <link rel=\"icon\" href=\"../assets/images/favicon_96x96.png\" sizes=\"96x96\"> <link rel=\"icon\" href=\"../assets/images/favicon_144x144.png\" sizes=\"144x144\"> <!-- Load CDNs : Pyodide (Python in WASM), Ace (Editor) and JQuery (Terminal) --> <script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ace.js\" type=\"text/javascript\" charset=\"utf-8\"></script> <script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ext-language_tools.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script> <script src=\"https://cdn.jsdelivr.net/pyodide/v0.17.0/full/pyodide.js\"></script> <script src=\"https://cdn.jsdelivr.net/pyodide/v0.17.0/full/pyodide.asm.js\"></script> <script src=\"https://cdn.jsdelivr.net/npm/js-md5\"></script> <script src=\"https://cdn.jsdelivr.net/npm/jquery\"></script> <script src=\"https://cdn.jsdelivr.net/npm/jquery.terminal@2.23.0/js/jquery.terminal.min.js\"></script> <link href=\"https://cdn.jsdelivr.net/npm/jquery.terminal@2.23.0/css/jquery.terminal.min.css\" rel=\"stylesheet\"> {% endblock %} Fichier CSS pyoditeur.css \u2693\ufe0e Afin de coller au th\u00e8me du site, recopiez et ajoutez le fichier pyoditeur.css au dossier docs/xtra/stylesheets/ . Si vous avez opt\u00e9 pour d'autres couleurs, c'est l\u00e0 que vous pourrez faire les modifications de l'\u00e9diteur. Fichiers javascripts interpreter.js et ide.js \u2693\ufe0e Deux fichiers Javascript interpreter.js et ide.js sont n\u00e9cessaires : interpreter.js doit \u00eatre plac\u00e9 dans le dossier : docs/xtra/javascripts/ ; ide.js doit \u00eatre plac\u00e9 dans le dossier : my_theme_customizations/js/ide.js . Fichiers start_REM.md et end_REM.md \u2693\ufe0e Pour la bonne gestion des fichiers de remarque, il faut \u00e9galement ajouter deux fichiers standardis\u00e9s au format markdown : start_REM.md et end_REM.md Images des boutons \u2693\ufe0e Les boutons doivent \u00eatre plac\u00e9s \u00e0 cette adresse : /docs/images/buttons/ . Il existe six boutons que vous pouvez r\u00e9cup\u00e9rer en t\u00e9l\u00e9chargeant l' archive . Syntaxe et exemples \u2693\ufe0e Syntaxe Markdown \u2693\ufe0e La syntaxe Terminal IDE vide IDE vertical IDE avec code IDE vertical avec code {{ terminal() }} Cr\u00e9ation d'un terminal vide. L'auto-compl\u00e9tion avec Tab et le rappel de l'historique (avec Ctrl \uff0b R ) sont possibles. >>> {{ IDE() }} Cr\u00e9ation d'un IDE (~ Thonny) vide. La fl\u00e8che permet de lancer le code tap\u00e9 dans la zone de saisie (avec les num\u00e9ros de ligne). La zone de saisie se redimensionne automatiquement et autorise l'auto-compl\u00e9tion de type snippet avec Tab . Lancer T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder {{ IDEv() }} Cette commande cr\u00e9e un IDE vide, avec division verticale. La fl\u00e8che permet de lancer le code tap\u00e9 dans la zone de saisie (avec les num\u00e9ros de ligne). La zone de saisie se redimensionne automatiquement et autorise l'auto-compl\u00e9tion de type snippet avec Tab . Lancer T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder {{ IDE('foo/bar/nom_de_fichier', MAX = 8, SANS = 'max,min') }} Cette commande charge le fichier nom_de_fichier.py dans un IDE. Le fichier doit \u00eatre dans docs/scripts/foo/bar/ . Ne pas oublier les guillemets. MAX = 8 indique le nombre maximal de tentatives de validation que l'\u00e9l\u00e8ve peut effectuer. MAX = 1000 permet de mettre ce nombre \u00e0 l'infini. Valeur par d\u00e9faut : MAX = 5 . SANS = 'max,min' permet d'interdire l'utilisation des fonctions built-ins max et min . Les IDE sont enregistr\u00e9s \u00e0 intervalle de temps r\u00e9gulier. Ils permettent \u00e9galement l'autocompl\u00e9tion avec la combinaison de touches Alt \uff0b Space . Lancer benchmark = ['longueur([])==0', 'longueur([1,3,5,5])==4', 'longueur([0]py-str100)==100']bksl-nl Valider \u221e/\u221e T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder L = [5,3,4,1]bksl-nlbksl-nldef longueur(L: list) -> int:bksl-nl return bksl-nl def longueur(L: list) -> int:bksl-nl return len(L)bksl-nl Remarque Ceci est un exemple complexe de remarque. La premi\u00e8re ligne du fichier de remarque doit \u00eatre vide La syntaxe markdown est compl\u00e8tement pr\u00e9serv\u00e9e. Par exemple, un tableau : a b c 1 2 3 Une admonition ? Vous pouvez inclure des admonitions et des superfences dans vos remarques. {{ IDEv('foo/bar/nom_de_fichier', MAX = 1000) }} Cette commande charge le fichier nom_de_fichier dans un IDE avec division verticale. Le fichier doit \u00eatre dans docs/scripts/foo/bar/ . Lancer benchmark = ['longueur([])==0', 'longueur([1,3,5,5])==4', 'longueur([0]py-str100)==100']bksl-nl Valider 3/3 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder L = [5,3,4,1]bksl-nlbksl-nldef longueur(L: list) -> int:bksl-nl return bksl-nl def longueur(L: list) -> int:bksl-nl return len(L)bksl-nl Remarque Ceci est un exemple complexe de remarque. La premi\u00e8re ligne du fichier de remarque doit \u00eatre vide La syntaxe markdown est compl\u00e8tement pr\u00e9serv\u00e9e. Par exemple, un tableau : a b c 1 2 3 Une admonition ? Vous pouvez inclure des admonitions et des superfences dans vos remarques. D\u00e9tails techniques Tous les IDE et les terminaux partagent le m\u00eame namespace . On peut donc acc\u00e9der \u00e0 n'importe quelle fonction cr\u00e9\u00e9e dans n'importe quel IDE ou terminal. C'est un comportement qui a l'avantage de pouvoir proposer des exercices o\u00f9 l'on construit petit \u00e0 petit un code complexe. Exemples \u2693\ufe0e L'exemple ci-dessous, obtenu avec {{ IDEv('exo2') }} . N'h\u00e9sitez pas \u00e0 modifier le code pour calculer la moyenne, l'\u00e9cart-type, afficher cela dans le terminal etc. Lancer 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 Valider 5/5 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder 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-nl def somme(L: list[int]) -> int:bksl-nl return None if len(L) == 0 else sum(L)bksl-nl A Remarque sur la solution C'est simple mais il faut \u00eatre vigilant. Une autre remarque est possible Toujours simple mais toujours vigilant. Z L'exemple ci-dessous a \u00e9t\u00e9 obtenu avec {{ IDE('algo_glouton') }} . Lancer T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder # dictionnaire :bksl-nl# - cl\u00e9 : nom de l'objetbksl-nl# - valeur : tableau [poids, prix]bksl-nlinventaire = {\"A\": [13,700], \"B\": [12,650], \"C\": [6,250], \"D\": [6,400],\"E\": [5, 100]}bksl-nlbksl-nl# Calcule la valeur massique en divisant la 2\u00e8me valeur du tableau par la premi\u00e8rebksl-nl# on ajoute cela \u00e0 la valeur du dictionnairebksl-nlfor objet, (poids, prix) in inventaire.items():bksl-nl inventaire[objet].append(prix/poids)bksl-nlbksl-nl# Trie le tableau en ordre d\u00e9croissant suivant la valeur massique.bksl-nldef f(dico: dict, col = 2):bksl-nl tableaupy-undtri\u00e9 = sorted(dico.items(), key = lambda a: a[1][col], reverse=True)bksl-nl return {cl\u00e9:valeur for cl\u00e9, valeur in tableaupy-undtri\u00e9}bksl-nlbksl-nlbksl-nlinventaire = f(inventaire, 2)bksl-nlbksl-nlpoidspy-undmax = 30bksl-nlbksl-nl# Algorithme gloutonbksl-nldef gloutonnerie(inventaire : dict, poidspy-undmax:int=30):bksl-nl sacpy-undapy-unddos = []bksl-nl poidspy-undsac = 0bksl-nl for objet, (poids, prix, vpy-undmassique) in inventaire.items():bksl-nl if poidspy-undsac + poids <= poidspy-undmax:bksl-nl sacpy-undapy-unddos.append(objet)bksl-nl poidspy-undsac += poidsbksl-nl return sacpy-undapy-unddos, poidspy-undsacbksl-nlbksl-nlprint(gloutonnerie(inventaire, poidspy-undmax))bksl-nlbksl-nlbksl-nl A Z","title":"Terminal et IDE dans Mkdocs"},{"location":"#terminal-et-ide-dans-mkdocs","text":"","title":"Terminal et IDE dans Mkdocs"},{"location":"#introduction","text":"Pyodide-Mkdocs est une solution technique permettant de cr\u00e9er un cours interactif \u00e0 partir d'un site g\u00e9n\u00e9r\u00e9 par Mkdocs. Il permet d'int\u00e9grer, dans le navigateur, c\u00f4t\u00e9 client : une console Python ; un \u00e9diteur de code ; un juge en ligne associ\u00e9 \u00e0 des corrig\u00e9s. Garantie : sans cookie sans inscription cr\u00e9\u00e9 par un enseignant pour les enseignants Solution La technologie permettant ce tour de force s'appelle Pyodide . Pyodide utilise WebAssembly pour faire le lien entre Python et Javascript et proposer un environnement permettant de manipuler le DOM avec Python, ou de manipuler Python avec Javascript.","title":"Introduction"},{"location":"#apercu","text":"Lancer # testsbksl-nlbksl-nlassert dentiste(\"j'ai mal\") == 'aia'bksl-nlassert dentiste(\"il fait chaud\") == 'iaiau'bksl-nlassert dentiste(\"\") == ''bksl-nlbksl-nlbksl-nl# pas d'autres testsbksl-nlbksl-nlassert dentiste(\"a\"py-str20 + \"b\"py-str10 + \"e\") == 'a'py-str20 + 'e'bksl-nlassert dentiste(\"b\"py-str10 + \"e\" + \"a\"py-str20) == 'e' + 'a'py-str20 bksl-nlassert dentiste(\"ab\"py-str10) == 'a'py-str10bksl-nlassert dentiste(\"aeiouy\"py-str10) == 'aeiouy'py-str10bksl-nlassert dentiste(\"z\"py-str100 + 'y') == 'y'bksl-nlbksl-nl Valider 5/5 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder voyelles = ['a', 'e', 'i', 'o', 'u', 'y']bksl-nlbksl-nldef dentiste(texte):bksl-nl passbksl-nlbksl-nlassert dentiste(\"j'ai mal\") == 'aia'bksl-nlassert dentiste(\"il fait chaud\") == 'iaiau'bksl-nlassert dentiste(\"\") == ''bksl-nlbksl-nl voyelles = ['a', 'e', 'i', 'o', 'u', 'y']bksl-nlbksl-nldef dentiste(texte):bksl-nl resultat = ''bksl-nl for lettre in texte:bksl-nl if lettre in voyelles:bksl-nl resultat = resultat + lettrebksl-nl return resultatbksl-nlbksl-nl A Une premi\u00e8re remarque Ceci est un exercice classique. D'autres d\u00e9tails On pourrait repr\u00e9senter la situation dans un tableau : a b c 1 2 3 Z","title":"Aper\u00e7u"},{"location":"#installation","text":"On part d'une installation comme indiqu\u00e9 sur [https://ens-fr.gitlab.io/mkdocs/] avec le plugin macro , pr\u00e9alablement install\u00e9. L'installation demande de rajouter \u00e0 cette configuration les \u00e9l\u00e9ments suivants. Modification : fichier YML mkdocs.yml ; fichier de macro main.py ; Ajout : un dossier my_theme_customizations/ \u00e0 la racine du projet Mkdocs ; un template HTML my_theme_customizations/main.html ; un fichier CSS docs/xtra/stylesheets/pyoditeur.css ; deux fichiers Javascript docs/xtra/javascripts/interpreter.js et my_theme_customizations/js/ide.js ; deux fichiers Markdown docs/xtra/start.md et docs/xtra/end.md .","title":"Installation"},{"location":"#fichier-yml-mkdocsyml","text":"Ajoutez les lignes surlign\u00e9es dans votre fichier mkdocs.yml . site_name : \"Terminal et REPL dans Mkdocs\" ... theme : name : material custom_dir : my_theme_customizations/ ... extra_javascript : - xtra/javascripts/mathjax-config.js # MathJax - javascripts/config.js - https://polyfill.io/v3/polyfill.min.js?features=es6 - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js - xtra/javascripts/interpreter.js extra_css : - xtra/stylesheets/pyoditeur.css - xtra/stylesheets/ajustements.css # ajustements","title":"Fichier YML mkdocs.yml"},{"location":"#fichier-macro-python-mainpy","text":"\u00c0 votre fichier main.py , ajoutez les lignes du fichier main.py .","title":"Fichier macro Python main.py"},{"location":"#creation-du-dossier-custom_dir","text":"N'oubliez pas de cr\u00e9er le dossier my_theme_customizations/ \u00e0 la racine du projet Mkdocs . Dans ce dossier, ajoutez le template Jinja main.html : {% extends \"base.html\" %} {% block content %} {{ super () }} <script src=\" {{ base_url }} /js/ide.js\"></script> {% endblock %} {% block libs %} {{ super () }} <!-- favicons --> <link rel=\"shortcut icon\" href=\"../assets/images/favicon.ico\" type=\"image/x-icon\"> <link rel=\"icon\" href=\"../assets/images/favicon_32x32.png\" sizes=\"32x32\"> <link rel=\"icon\" href=\"../assets/images/favicon_96x96.png\" sizes=\"96x96\"> <link rel=\"icon\" href=\"../assets/images/favicon_144x144.png\" sizes=\"144x144\"> <!-- Load CDNs : Pyodide (Python in WASM), Ace (Editor) and JQuery (Terminal) --> <script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ace.js\" type=\"text/javascript\" charset=\"utf-8\"></script> <script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ext-language_tools.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script> <script src=\"https://cdn.jsdelivr.net/pyodide/v0.17.0/full/pyodide.js\"></script> <script src=\"https://cdn.jsdelivr.net/pyodide/v0.17.0/full/pyodide.asm.js\"></script> <script src=\"https://cdn.jsdelivr.net/npm/js-md5\"></script> <script src=\"https://cdn.jsdelivr.net/npm/jquery\"></script> <script src=\"https://cdn.jsdelivr.net/npm/jquery.terminal@2.23.0/js/jquery.terminal.min.js\"></script> <link href=\"https://cdn.jsdelivr.net/npm/jquery.terminal@2.23.0/css/jquery.terminal.min.css\" rel=\"stylesheet\"> {% endblock %}","title":"Cr\u00e9ation du dossier custom_dir"},{"location":"#fichier-css-pyoditeurcss","text":"Afin de coller au th\u00e8me du site, recopiez et ajoutez le fichier pyoditeur.css au dossier docs/xtra/stylesheets/ . Si vous avez opt\u00e9 pour d'autres couleurs, c'est l\u00e0 que vous pourrez faire les modifications de l'\u00e9diteur.","title":"Fichier CSS pyoditeur.css"},{"location":"#fichiers-javascripts-interpreterjs-et-idejs","text":"Deux fichiers Javascript interpreter.js et ide.js sont n\u00e9cessaires : interpreter.js doit \u00eatre plac\u00e9 dans le dossier : docs/xtra/javascripts/ ; ide.js doit \u00eatre plac\u00e9 dans le dossier : my_theme_customizations/js/ide.js .","title":"Fichiers javascripts interpreter.js et ide.js"},{"location":"#fichiers-start_remmd-et-end_remmd","text":"Pour la bonne gestion des fichiers de remarque, il faut \u00e9galement ajouter deux fichiers standardis\u00e9s au format markdown : start_REM.md et end_REM.md","title":"Fichiers start_REM.md et end_REM.md"},{"location":"#images-des-boutons","text":"Les boutons doivent \u00eatre plac\u00e9s \u00e0 cette adresse : /docs/images/buttons/ . Il existe six boutons que vous pouvez r\u00e9cup\u00e9rer en t\u00e9l\u00e9chargeant l' archive .","title":"Images des boutons"},{"location":"#syntaxe-et-exemples","text":"","title":"Syntaxe et exemples"},{"location":"#syntaxe-markdown","text":"La syntaxe Terminal IDE vide IDE vertical IDE avec code IDE vertical avec code {{ terminal() }} Cr\u00e9ation d'un terminal vide. L'auto-compl\u00e9tion avec Tab et le rappel de l'historique (avec Ctrl \uff0b R ) sont possibles. >>> {{ IDE() }} Cr\u00e9ation d'un IDE (~ Thonny) vide. La fl\u00e8che permet de lancer le code tap\u00e9 dans la zone de saisie (avec les num\u00e9ros de ligne). La zone de saisie se redimensionne automatiquement et autorise l'auto-compl\u00e9tion de type snippet avec Tab . Lancer T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder {{ IDEv() }} Cette commande cr\u00e9e un IDE vide, avec division verticale. La fl\u00e8che permet de lancer le code tap\u00e9 dans la zone de saisie (avec les num\u00e9ros de ligne). La zone de saisie se redimensionne automatiquement et autorise l'auto-compl\u00e9tion de type snippet avec Tab . Lancer T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder {{ IDE('foo/bar/nom_de_fichier', MAX = 8, SANS = 'max,min') }} Cette commande charge le fichier nom_de_fichier.py dans un IDE. Le fichier doit \u00eatre dans docs/scripts/foo/bar/ . Ne pas oublier les guillemets. MAX = 8 indique le nombre maximal de tentatives de validation que l'\u00e9l\u00e8ve peut effectuer. MAX = 1000 permet de mettre ce nombre \u00e0 l'infini. Valeur par d\u00e9faut : MAX = 5 . SANS = 'max,min' permet d'interdire l'utilisation des fonctions built-ins max et min . Les IDE sont enregistr\u00e9s \u00e0 intervalle de temps r\u00e9gulier. Ils permettent \u00e9galement l'autocompl\u00e9tion avec la combinaison de touches Alt \uff0b Space . Lancer benchmark = ['longueur([])==0', 'longueur([1,3,5,5])==4', 'longueur([0]py-str100)==100']bksl-nl Valider \u221e/\u221e T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder L = [5,3,4,1]bksl-nlbksl-nldef longueur(L: list) -> int:bksl-nl return bksl-nl def longueur(L: list) -> int:bksl-nl return len(L)bksl-nl Remarque Ceci est un exemple complexe de remarque. La premi\u00e8re ligne du fichier de remarque doit \u00eatre vide La syntaxe markdown est compl\u00e8tement pr\u00e9serv\u00e9e. Par exemple, un tableau : a b c 1 2 3 Une admonition ? Vous pouvez inclure des admonitions et des superfences dans vos remarques. {{ IDEv('foo/bar/nom_de_fichier', MAX = 1000) }} Cette commande charge le fichier nom_de_fichier dans un IDE avec division verticale. Le fichier doit \u00eatre dans docs/scripts/foo/bar/ . Lancer benchmark = ['longueur([])==0', 'longueur([1,3,5,5])==4', 'longueur([0]py-str100)==100']bksl-nl Valider 3/3 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder L = [5,3,4,1]bksl-nlbksl-nldef longueur(L: list) -> int:bksl-nl return bksl-nl def longueur(L: list) -> int:bksl-nl return len(L)bksl-nl Remarque Ceci est un exemple complexe de remarque. La premi\u00e8re ligne du fichier de remarque doit \u00eatre vide La syntaxe markdown est compl\u00e8tement pr\u00e9serv\u00e9e. Par exemple, un tableau : a b c 1 2 3 Une admonition ? Vous pouvez inclure des admonitions et des superfences dans vos remarques. D\u00e9tails techniques Tous les IDE et les terminaux partagent le m\u00eame namespace . On peut donc acc\u00e9der \u00e0 n'importe quelle fonction cr\u00e9\u00e9e dans n'importe quel IDE ou terminal. C'est un comportement qui a l'avantage de pouvoir proposer des exercices o\u00f9 l'on construit petit \u00e0 petit un code complexe.","title":"Syntaxe Markdown"},{"location":"#exemples","text":"L'exemple ci-dessous, obtenu avec {{ IDEv('exo2') }} . N'h\u00e9sitez pas \u00e0 modifier le code pour calculer la moyenne, l'\u00e9cart-type, afficher cela dans le terminal etc. Lancer 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 Valider 5/5 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder 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-nl def somme(L: list[int]) -> int:bksl-nl return None if len(L) == 0 else sum(L)bksl-nl A Remarque sur la solution C'est simple mais il faut \u00eatre vigilant. Une autre remarque est possible Toujours simple mais toujours vigilant. Z L'exemple ci-dessous a \u00e9t\u00e9 obtenu avec {{ IDE('algo_glouton') }} . Lancer T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder # dictionnaire :bksl-nl# - cl\u00e9 : nom de l'objetbksl-nl# - valeur : tableau [poids, prix]bksl-nlinventaire = {\"A\": [13,700], \"B\": [12,650], \"C\": [6,250], \"D\": [6,400],\"E\": [5, 100]}bksl-nlbksl-nl# Calcule la valeur massique en divisant la 2\u00e8me valeur du tableau par la premi\u00e8rebksl-nl# on ajoute cela \u00e0 la valeur du dictionnairebksl-nlfor objet, (poids, prix) in inventaire.items():bksl-nl inventaire[objet].append(prix/poids)bksl-nlbksl-nl# Trie le tableau en ordre d\u00e9croissant suivant la valeur massique.bksl-nldef f(dico: dict, col = 2):bksl-nl tableaupy-undtri\u00e9 = sorted(dico.items(), key = lambda a: a[1][col], reverse=True)bksl-nl return {cl\u00e9:valeur for cl\u00e9, valeur in tableaupy-undtri\u00e9}bksl-nlbksl-nlbksl-nlinventaire = f(inventaire, 2)bksl-nlbksl-nlpoidspy-undmax = 30bksl-nlbksl-nl# Algorithme gloutonbksl-nldef gloutonnerie(inventaire : dict, poidspy-undmax:int=30):bksl-nl sacpy-undapy-unddos = []bksl-nl poidspy-undsac = 0bksl-nl for objet, (poids, prix, vpy-undmassique) in inventaire.items():bksl-nl if poidspy-undsac + poids <= poidspy-undmax:bksl-nl sacpy-undapy-unddos.append(objet)bksl-nl poidspy-undsac += poidsbksl-nl return sacpy-undapy-unddos, poidspy-undsacbksl-nlbksl-nlprint(gloutonnerie(inventaire, poidspy-undmax))bksl-nlbksl-nlbksl-nl A Z","title":"Exemples"},{"location":"install_ide/","text":"Guide de l'IDE \u2693\ufe0e Exemple \u2693\ufe0e Un IDE se pr\u00e9sente sous cette forme : Enroulez-moi ! Lancer 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 Valider \u221e/\u221e T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder 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-nl def 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 \u00eatre vigilant. Une autre remarque est possible Toujours simple mais toujours vigilant. Il dispose de quatre boutons : Lancer le script : T\u00e9l\u00e9charger le script : T\u00e9l\u00e9verser un script : Valider le script avec des tests unitaires : Rappel Tout se fait du c\u00f4t\u00e9 client. Rien n'est envoy\u00e9 au serveur . Prise en main \u2693\ufe0e Par d\u00e9faut, la commande {{IDE('exo2')}} permet de charger un script plac\u00e9 dans docs/scripts/ . Organisation possible Classement par chapitre Classement par exercice 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\u00e9 dans mkdocs.yml . Dans ce cas, seul le chemin relatif depuis la position du fichier markdown dans l'arborescence est \u00e0 indiquer. Par exemple: mkdocs.yml contient la ligne - \"E-nsi \ud83c\udfd6\": 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 \u00e0 l'aide de tests unitaires est pr\u00e9sent uniquement si vous fournissez un fichier nom_du_fichier_test.py pr\u00e9sent dans le m\u00eame r\u00e9pertoire que nom_du_fichier.py . La solution apparait au bout de 5 tests unitaires si vous fournissez un fichier nom_du_fichier_corr.py dans le m\u00eame r\u00e9pertoire que nom_du_fichier.py . Le lancement du script, le t\u00e9l\u00e9chargement et le t\u00e9l\u00e9versement sont pr\u00e9sentes par d\u00e9faut. Format de fichiers Fichier Python Fichier Correction Fichier Juge - Benchmark Fichier Juge - Assert Le script Python est \u00e9crit de mani\u00e8re classique. Les librairies standards sont accept\u00e9s. Les annotations, m\u00eame complexes, sont normalement accept\u00e9es : merci de me contacter si vous observez des comportements inattendus. Le fichier Python de correction nom_de_script_corr.py est \u00e9crit de mani\u00e8re 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\u00e9e benchmark , de type list ou tuple : 1) Si l'on souhaite v\u00e9rifier une unique fonction gr\u00e2ce \u00e0 l'\u00e9valuateur de code : 1 benchmark = [ 'longueur([])==0' , 'longueur([1,3,5,5])==4' , 'longueur([0]*100)==100' ] On a donc un tuple de cha\u00eenes de caract\u00e8res qui sera \u00e9valu\u00e9 avec eval () . 1) Si l'on souhaite v\u00e9rifier plusieurs fonctions gr\u00e2ce \u00e0 l'\u00e9valuateur 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\u00eenes de caract\u00e8res qui sera \u00e9valu\u00e9 avec eval () . Le fichier de juge en ligne peut \u00eatre \u00e9crit de mani\u00e8re 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 \u00e9valu\u00e9s par Pyodide. Seul le test ayant \u00e9chou\u00e9 sera affich\u00e9. Les tests r\u00e9ussis n'afficheront rien. Pas de probl\u00e8me pour tester autant de fonctions que n\u00e9cessaire. Conclusion \u00c0 condition que les fichiers *_corr.py et *_test.py soient pr\u00e9sents, {{IDE('foo/bar/truc/muche/fichier')}} g\u00e8re tout seul : l'\u00e9nonc\u00e9, le juge en ligne, les fichiers de correction Plein d'exercices ! \u2693\ufe0e Exercices sur la longueur d'un tableau Exercice 1 Exercice 2 Exercice 3 Compl\u00e9tez la fonction longueur afin que celle-ci renvoie la taille d'un tableau L. Lancer benchmark = ['longueur([])==0', 'longueur([1,3,5,5])==4', 'longueur([0]py-str100)==100']bksl-nl Valider \u221e/\u221e T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder L = [5,3,4,1]bksl-nlbksl-nldef longueur(L: list) -> int:bksl-nl return bksl-nl def longueur(L: list) -> int:bksl-nl return len(L)bksl-nl Remarque Ceci est un exemple complexe de remarque. La premi\u00e8re ligne du fichier de remarque doit \u00eatre vide La syntaxe markdown est compl\u00e8tement pr\u00e9serv\u00e9e. Par exemple, un tableau : a b c 1 2 3 Une admonition ? Vous pouvez inclure des admonitions et des superfences dans vos remarques. Compl\u00e9tez la fonction longueur_ajout afin que celle-ci renvoie la taille de deux tableaux T1 et T2. Lancer 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 Valider 5/5 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder T1 = [5,3,4,1]bksl-nlT2 = [1,2]bksl-nlbksl-nldef longueurpy-undajout(T1: list, T2: list) -> int:bksl-nl return bksl-nl def longueurpy-undajout(T1: list, T2: list) -> int:bksl-nl return len(T1) + len(T2)bksl-nl Des admonitions en remarque On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can. Toujours plus On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can. Encore On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can. On d\u00e9coupe une phrase \u00e0 l'aide de l'instruction split . Compl\u00e9tez la fonction nombre_mots afin que celle-ci renvoie le nombre de mots s\u00e9par\u00e9 par un espace d'une phrase phrase . Lancer benchmark = ['nombrepy-undmots(\"Mon chien est beau.\") == 4', 'nombrepy-undmots(\"\") == 0', 'nombrepy-undmots(\"L\\'esth\u00e8te a des vices que la vertu ignore.\") == 8']bksl-nl Valider 5/5 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder adage = \"Mon chien est beau.\"bksl-nlbksl-nldef nombrepy-undmots(phrase: str) -> int:bksl-nl # tableaupy-undmots = bksl-nl return bksl-nl adage = \"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 Exercice 1 Exercice 2 Exercice 3 Compl\u00e9tez la fonction longueur afin que celle-ci renvoie la taille d'un tableau L. Lancer benchmark = ['longueur([])==0', 'longueur([1,3,5,5])==4', 'longueur([0]py-str100)==100']bksl-nl Valider \u221e/\u221e T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder L = [5,3,4,1]bksl-nlbksl-nldef longueur(L: list) -> int:bksl-nl return bksl-nl def longueur(L: list) -> int:bksl-nl return len(L)bksl-nl Remarque Ceci est un exemple complexe de remarque. La premi\u00e8re ligne du fichier de remarque doit \u00eatre vide La syntaxe markdown est compl\u00e8tement pr\u00e9serv\u00e9e. Par exemple, un tableau : a b c 1 2 3 Une admonition ? Vous pouvez inclure des admonitions et des superfences dans vos remarques. Compl\u00e9tez la fonction longueur_ajout afin que celle-ci renvoie la taille de deux tableaux T1 et T2. Lancer 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 Valider 5/5 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder T1 = [5,3,4,1]bksl-nlT2 = [1,2]bksl-nlbksl-nldef longueurpy-undajout(T1: list, T2: list) -> int:bksl-nl return bksl-nl def longueurpy-undajout(T1: list, T2: list) -> int:bksl-nl return len(T1) + len(T2)bksl-nl Des admonitions en remarque On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can. Toujours plus On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can. Encore On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can. On d\u00e9coupe une phrase \u00e0 l'aide de l'instruction split . Compl\u00e9tez la fonction nombre_mots afin que celle-ci renvoie le nombre de mots s\u00e9par\u00e9 par un espace d'une phrase phrase . Lancer benchmark = ['nombrepy-undmots(\"Mon chien est beau.\") == 4', 'nombrepy-undmots(\"\") == 0', 'nombrepy-undmots(\"L\\'esth\u00e8te a des vices que la vertu ignore.\") == 8']bksl-nl Valider 5/5 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder adage = \"Mon chien est beau.\"bksl-nlbksl-nldef nombrepy-undmots(phrase: str) -> int:bksl-nl # tableaupy-undmots = bksl-nl return bksl-nl adage = \"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 ! \u2693\ufe0e Pour l'instant, j'ai la grosse flemme d'\u00e9crire cette section. En quelques mots, on cr\u00e9e deux div d\u00e9sign\u00e9 par un num\u00e9ro auto-incr\u00e9ment\u00e9 : < div id = \"editor_6\" > cr\u00e9e la partie \u00e9diteur de texte. Ce div est converti en \u00e9diteur gr\u00e2ce \u00e0 l' \u00e9diteur ACE ; < div id = \"term_editor_6\" > cr\u00e9e la partie Terminal. Le Terminal n'est cr\u00e9\u00e9 qu'au moment de la validation du script ou du juge en ligne. Il est cr\u00e9\u00e9 gr\u00e2ce au plugin Terminal de jQuery par converstion du div (voir section Guide du Terminal).","title":"Guide de l'IDE"},{"location":"install_ide/#guide-de-lide","text":"","title":"Guide de l'IDE"},{"location":"install_ide/#exemple","text":"Un IDE se pr\u00e9sente sous cette forme : Enroulez-moi ! Lancer 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 Valider \u221e/\u221e T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder 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-nl def 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 \u00eatre vigilant. Une autre remarque est possible Toujours simple mais toujours vigilant. Il dispose de quatre boutons : Lancer le script : T\u00e9l\u00e9charger le script : T\u00e9l\u00e9verser un script : Valider le script avec des tests unitaires : Rappel Tout se fait du c\u00f4t\u00e9 client. Rien n'est envoy\u00e9 au serveur .","title":"Exemple"},{"location":"install_ide/#prise-en-main","text":"Par d\u00e9faut, la commande {{IDE('exo2')}} permet de charger un script plac\u00e9 dans docs/scripts/ . Organisation possible Classement par chapitre Classement par exercice 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\u00e9 dans mkdocs.yml . Dans ce cas, seul le chemin relatif depuis la position du fichier markdown dans l'arborescence est \u00e0 indiquer. Par exemple: mkdocs.yml contient la ligne - \"E-nsi \ud83c\udfd6\": 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 \u00e0 l'aide de tests unitaires est pr\u00e9sent uniquement si vous fournissez un fichier nom_du_fichier_test.py pr\u00e9sent dans le m\u00eame r\u00e9pertoire que nom_du_fichier.py . La solution apparait au bout de 5 tests unitaires si vous fournissez un fichier nom_du_fichier_corr.py dans le m\u00eame r\u00e9pertoire que nom_du_fichier.py . Le lancement du script, le t\u00e9l\u00e9chargement et le t\u00e9l\u00e9versement sont pr\u00e9sentes par d\u00e9faut. Format de fichiers Fichier Python Fichier Correction Fichier Juge - Benchmark Fichier Juge - Assert Le script Python est \u00e9crit de mani\u00e8re classique. Les librairies standards sont accept\u00e9s. Les annotations, m\u00eame complexes, sont normalement accept\u00e9es : merci de me contacter si vous observez des comportements inattendus. Le fichier Python de correction nom_de_script_corr.py est \u00e9crit de mani\u00e8re 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\u00e9e benchmark , de type list ou tuple : 1) Si l'on souhaite v\u00e9rifier une unique fonction gr\u00e2ce \u00e0 l'\u00e9valuateur de code : 1 benchmark = [ 'longueur([])==0' , 'longueur([1,3,5,5])==4' , 'longueur([0]*100)==100' ] On a donc un tuple de cha\u00eenes de caract\u00e8res qui sera \u00e9valu\u00e9 avec eval () . 1) Si l'on souhaite v\u00e9rifier plusieurs fonctions gr\u00e2ce \u00e0 l'\u00e9valuateur 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\u00eenes de caract\u00e8res qui sera \u00e9valu\u00e9 avec eval () . Le fichier de juge en ligne peut \u00eatre \u00e9crit de mani\u00e8re 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 \u00e9valu\u00e9s par Pyodide. Seul le test ayant \u00e9chou\u00e9 sera affich\u00e9. Les tests r\u00e9ussis n'afficheront rien. Pas de probl\u00e8me pour tester autant de fonctions que n\u00e9cessaire. Conclusion \u00c0 condition que les fichiers *_corr.py et *_test.py soient pr\u00e9sents, {{IDE('foo/bar/truc/muche/fichier')}} g\u00e8re tout seul : l'\u00e9nonc\u00e9, le juge en ligne, les fichiers de correction","title":"Prise en main"},{"location":"install_ide/#plein-dexercices","text":"Exercices sur la longueur d'un tableau Exercice 1 Exercice 2 Exercice 3 Compl\u00e9tez la fonction longueur afin que celle-ci renvoie la taille d'un tableau L. Lancer benchmark = ['longueur([])==0', 'longueur([1,3,5,5])==4', 'longueur([0]py-str100)==100']bksl-nl Valider \u221e/\u221e T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder L = [5,3,4,1]bksl-nlbksl-nldef longueur(L: list) -> int:bksl-nl return bksl-nl def longueur(L: list) -> int:bksl-nl return len(L)bksl-nl Remarque Ceci est un exemple complexe de remarque. La premi\u00e8re ligne du fichier de remarque doit \u00eatre vide La syntaxe markdown est compl\u00e8tement pr\u00e9serv\u00e9e. Par exemple, un tableau : a b c 1 2 3 Une admonition ? Vous pouvez inclure des admonitions et des superfences dans vos remarques. Compl\u00e9tez la fonction longueur_ajout afin que celle-ci renvoie la taille de deux tableaux T1 et T2. Lancer 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 Valider 5/5 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder T1 = [5,3,4,1]bksl-nlT2 = [1,2]bksl-nlbksl-nldef longueurpy-undajout(T1: list, T2: list) -> int:bksl-nl return bksl-nl def longueurpy-undajout(T1: list, T2: list) -> int:bksl-nl return len(T1) + len(T2)bksl-nl Des admonitions en remarque On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can. Toujours plus On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can. Encore On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can. On d\u00e9coupe une phrase \u00e0 l'aide de l'instruction split . Compl\u00e9tez la fonction nombre_mots afin que celle-ci renvoie le nombre de mots s\u00e9par\u00e9 par un espace d'une phrase phrase . Lancer benchmark = ['nombrepy-undmots(\"Mon chien est beau.\") == 4', 'nombrepy-undmots(\"\") == 0', 'nombrepy-undmots(\"L\\'esth\u00e8te a des vices que la vertu ignore.\") == 8']bksl-nl Valider 5/5 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder adage = \"Mon chien est beau.\"bksl-nlbksl-nldef nombrepy-undmots(phrase: str) -> int:bksl-nl # tableaupy-undmots = bksl-nl return bksl-nl adage = \"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 Exercice 1 Exercice 2 Exercice 3 Compl\u00e9tez la fonction longueur afin que celle-ci renvoie la taille d'un tableau L. Lancer benchmark = ['longueur([])==0', 'longueur([1,3,5,5])==4', 'longueur([0]py-str100)==100']bksl-nl Valider \u221e/\u221e T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder L = [5,3,4,1]bksl-nlbksl-nldef longueur(L: list) -> int:bksl-nl return bksl-nl def longueur(L: list) -> int:bksl-nl return len(L)bksl-nl Remarque Ceci est un exemple complexe de remarque. La premi\u00e8re ligne du fichier de remarque doit \u00eatre vide La syntaxe markdown est compl\u00e8tement pr\u00e9serv\u00e9e. Par exemple, un tableau : a b c 1 2 3 Une admonition ? Vous pouvez inclure des admonitions et des superfences dans vos remarques. Compl\u00e9tez la fonction longueur_ajout afin que celle-ci renvoie la taille de deux tableaux T1 et T2. Lancer 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 Valider 5/5 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder T1 = [5,3,4,1]bksl-nlT2 = [1,2]bksl-nlbksl-nldef longueurpy-undajout(T1: list, T2: list) -> int:bksl-nl return bksl-nl def longueurpy-undajout(T1: list, T2: list) -> int:bksl-nl return len(T1) + len(T2)bksl-nl Des admonitions en remarque On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can. Toujours plus On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can. Encore On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can. On d\u00e9coupe une phrase \u00e0 l'aide de l'instruction split . Compl\u00e9tez la fonction nombre_mots afin que celle-ci renvoie le nombre de mots s\u00e9par\u00e9 par un espace d'une phrase phrase . Lancer benchmark = ['nombrepy-undmots(\"Mon chien est beau.\") == 4', 'nombrepy-undmots(\"\") == 0', 'nombrepy-undmots(\"L\\'esth\u00e8te a des vices que la vertu ignore.\") == 8']bksl-nl Valider 5/5 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder adage = \"Mon chien est beau.\"bksl-nlbksl-nldef nombrepy-undmots(phrase: str) -> int:bksl-nl # tableaupy-undmots = bksl-nl return bksl-nl adage = \"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","title":"Plein d'exercices !"},{"location":"install_ide/#technique","text":"Pour l'instant, j'ai la grosse flemme d'\u00e9crire cette section. En quelques mots, on cr\u00e9e deux div d\u00e9sign\u00e9 par un num\u00e9ro auto-incr\u00e9ment\u00e9 : < div id = \"editor_6\" > cr\u00e9e la partie \u00e9diteur de texte. Ce div est converti en \u00e9diteur gr\u00e2ce \u00e0 l' \u00e9diteur ACE ; < div id = \"term_editor_6\" > cr\u00e9e la partie Terminal. Le Terminal n'est cr\u00e9\u00e9 qu'au moment de la validation du script ou du juge en ligne. Il est cr\u00e9\u00e9 gr\u00e2ce au plugin Terminal de jQuery par converstion du div (voir section Guide du Terminal).","title":"Technique !"},{"location":"install_term/","text":"Guide du Terminal \u2693\ufe0e Exemple \u2693\ufe0e >>> Technique \u2693\ufe0e Techniquement, le terminal est obtenu en utilisant le plugin Terminal de jQuery 1 . On cr\u00e9e un < div > qui poss\u00e8de un identificateur num\u00e9ro (entier commen\u00e7ant \u00e0 1 et auto-incr\u00e9ment\u00e9). Ce < div > est ensuite colori\u00e9 \u00e0 l'aide du plugin Terminal. Technique Un probl\u00e8me provient du focus du terminal. Par d\u00e9faut, le dernier terminal cr\u00e9\u00e9 aura le focus, ce qui souvent nous emm\u00e8ne en bas de page... La solution a \u00e9t\u00e9 de cr\u00e9er deux < div > : Le premier < div > est un simple bloc de texte mimant un Terminal. Il est appel\u00e9 fake_id . Le second < div > contient effectivement le Terminal. Il ne se cr\u00e9era que si l'\u00e9v\u00e9nement onclick du < div id = fake_id > est d\u00e9clench\u00e9. Vraiment tr\u00e8s technique Voir aussi les fonctions pyterm et start_term de interpreter.js . C'est pour cela qu'on ne peut pas se passer de jQuery actuellement. \u21a9","title":"Guide du Terminal"},{"location":"install_term/#guide-du-terminal","text":"","title":"Guide du Terminal"},{"location":"install_term/#exemple","text":">>>","title":"Exemple"},{"location":"install_term/#technique","text":"Techniquement, le terminal est obtenu en utilisant le plugin Terminal de jQuery 1 . On cr\u00e9e un < div > qui poss\u00e8de un identificateur num\u00e9ro (entier commen\u00e7ant \u00e0 1 et auto-incr\u00e9ment\u00e9). Ce < div > est ensuite colori\u00e9 \u00e0 l'aide du plugin Terminal. Technique Un probl\u00e8me provient du focus du terminal. Par d\u00e9faut, le dernier terminal cr\u00e9\u00e9 aura le focus, ce qui souvent nous emm\u00e8ne en bas de page... La solution a \u00e9t\u00e9 de cr\u00e9er deux < div > : Le premier < div > est un simple bloc de texte mimant un Terminal. Il est appel\u00e9 fake_id . Le second < div > contient effectivement le Terminal. Il ne se cr\u00e9era que si l'\u00e9v\u00e9nement onclick du < div id = fake_id > est d\u00e9clench\u00e9. Vraiment tr\u00e8s technique Voir aussi les fonctions pyterm et start_term de interpreter.js . C'est pour cela qu'on ne peut pas se passer de jQuery actuellement. \u21a9","title":"Technique"},{"location":"sandbox/","text":"Bac \u00e0 sable \u2693\ufe0e // // jQuery cross domain ajax // $.get(\"http://www.example.org/ajax.php\").done(function (data) { // console.log(data); // }); // // using XMLHttpRequest // var xhr = new XMLHttpRequest(); // xhr.open(\"GET\", \"http://www.example.org/ajax.php\", true); // xhr.onload = function () { // console.log(xhr.responseText); // }; // xhr.send(); // using the Fetch API const myInit = { method: 'GET', mode: 'no-cors', cache: 'default', }; fetch(\"https://gitlab.com/bouillotvincent/tests-avec-mkdocs/-/blob/main/main.py\", myInit) .then(function(response) { return response.blob(); }) .then(function(myBlob) { const objectURL = URL.createObjectURL(myBlob); console.log(objectURL); });","title":"Bac \u00e0 sable"},{"location":"sandbox/#bac-a-sable","text":"// // jQuery cross domain ajax // $.get(\"http://www.example.org/ajax.php\").done(function (data) { // console.log(data); // }); // // using XMLHttpRequest // var xhr = new XMLHttpRequest(); // xhr.open(\"GET\", \"http://www.example.org/ajax.php\", true); // xhr.onload = function () { // console.log(xhr.responseText); // }; // xhr.send(); // using the Fetch API const myInit = { method: 'GET', mode: 'no-cors', cache: 'default', }; fetch(\"https://gitlab.com/bouillotvincent/tests-avec-mkdocs/-/blob/main/main.py\", myInit) .then(function(response) { return response.blob(); }) .then(function(myBlob) { const objectURL = URL.createObjectURL(myBlob); console.log(objectURL); });","title":"Bac \u00e0 sable"},{"location":"todo/","text":"Des questions techniques et m\u00e9taphysiques \u2693\ufe0e Todo list \u2693\ufe0e :x: D\u00e9marrer le comptage des 5 essais avant r\u00e9v\u00e9lation du code si les premiers tests sont pass\u00e9s. :x: Autocompl\u00e9tion du code avec une touche simple (pas de Live autocompl\u00e9tion -_-) :x: La fen\u00eatre d\u2019\u00e9dition est r\u00e9serv\u00e9e au code de l\u2019\u00e9l\u00e8ve. Les premiers tests sont dans une fen\u00eatre coll\u00e9e, juste en dessous, visible mais non \u00e9ditable. Ils peuvent \u00eatre masqu\u00e9s/affich\u00e9s. :x: Am\u00e9lioration des performances d'affichage :x: t\u00e9l\u00e9charger tous les codes \u00e9crits dans les \u00e9diteurs de la page en un seul fichier :x: Doctests :white_check_mark: eval d\u00e9sactiv\u00e9 en fonction de la pr\u00e9sence du mot-cl\u00e9 SANS = 'eval,max' dans l'appel \u00e0 IDE(..., SANS = ...) . Prendre en compte les erreurs du cr\u00e9ateur SANS = 'eval, MaX , min' . :white_check_mark: Erreur d'assertions et gestion de crash de code Mode verbose pour les tests / mode simple Mode infini pour les tentatives :white_check_mark: sauvegarde des codes lors d'un rechargement de la page (oui!!!!) :white_check_mark: gestion des fichiers d'initialisation (pour les codes longs) :white_check_mark: Le code solution apparait dans le code source... A cacher d'une mani\u00e8re ou d'une autre :white_check_mark: Mode sombre / Mode clair (r\u00e9glage ind\u00e9pendant du choix de palette) :white_check_mark: Caract\u00e8res non-ASCII pour nom de fichier et contenu :white_check_mark: Fichier de remarque, <nom_du_truc>_rem.txt Solution en page externe pour les fichiers longs (exclue du menu de navigation avec le hack) Solution en menu d\u00e9roulant pour les fichiers courts :white_check_mark: Modifications des emoji par des svg classe :white_check_mark: Infobulles :white_check_mark: Chemins relatifs :white_check_mark: Nombre d'essais vari\u00e9s En d\u00e9veloppement \u2693\ufe0e Inclure des fichiers externes avec macros fonctionnels Jinja syntax to include an external remark file, including an IDE to give the correction : {% include 'scripts/demo/demo2_rem.txt' %} This is the future of the online judge Can include automatically a correction. Needs lots of refactoring though \u23f3\u23f3\u23f3. REPL > IDE Une reprise compl\u00e8te de la d\u00e9nomination a \u00e9t\u00e9 faite. Les REPL s'appellent maintenant (et \u00e0 raison) IDE Merci Fred Leleu pour le travail suppl\u00e9mentaire \ud83d\ude0d . Fichiers javascripts C'est le bazar dans l'appel des fichiers JS. Si quelqu'un peut me mettre de l'ordre dans tout cela, je suis preneur ! J'ai repris l'organisation g\u00e9n\u00e9rale. C'est toujours un peu le bazar mais cela me semble acceptable. Importation automatique de module Pyodide propose un module micropip permettant de charger les modules manquants. Nous pourrions faire des interfaces graphiques \u00e0 l'aide de cela mais est-ce vraiment utile ? Evaluateur de code Avec l'utilisation du code de fjunier , nous pourrions int\u00e9grer un juge en ligne ? Utile ou non ? L'\u00e9valuateur de code est fonctionnel et permet de faire des benchmarks complexes. Le bouton du juge en ligne n'apparaitra que s'il existe un fichier de benchmark test_nom_de_script.py . Le corrig\u00e9 n'apparaitra que si un fichier de corr_nom_de_script.py est pr\u00e9sent. Il faudra cr\u00e9er un pipe pour g\u00e9n\u00e9rer automatiquement un fichier de benchmark depuis un script de corrig\u00e9. Javascript et IDE La solution avec le -1 dans main.py , discut\u00e9e dans le guide technique du IDE, est vraiment naze. Il faut trouver autre chose. Je devais vraiment dormir. On peut tout simplement ajouter une ligne dans le template Jinja2 main.html du custom_dir de mkdocs. Cela permet de charger le javascript n\u00e9cessaire au bon fonctionnement des IDE sans s'emb\u00eater. Boutons et IDE La solution avec le -1 dans main.py , discut\u00e9e dans le guide technique du IDE, est vraiment naze. Il faut trouver autre chose. Ajout de boutons permettant de t\u00e9l\u00e9charger les scripts \u00e9crits et t\u00e9l\u00e9verser les scripts disponibles localement. Evaluateur de code ajout\u00e9. Partis pris \u2693\ufe0e Namespace partag\u00e9 Je trouve ce mode tr\u00e8s pratique car on conserve nos fonctions et variables d'un terminal \u00e0 l'autre au cours d'une le\u00e7on. P\u00e9dagogiquement, c'est plus discutable car certaines variables seront initialis\u00e9es dans le Terminal 1 et utilis\u00e9es dans le Terminal 2. Cela cache la notion d'initialisation. IDE vertical Est-ce vraiment utile de les conserver ? Cela ralentit le chargement de la page web et consomme des ressources pour l'auto-redimensionnement de la partie terminal du IDE. Cela est sp\u00e9cialement visible sur mobile (ou ce mode est d'ailleurs inutile). Quelques modifications ont permis de les conserver sans alt\u00e9rer les performances. macro Python Ma solution est un peu sale mais a-t-on vraiment le choix avec l'inclusion de balise HTML ? J'ai choisi de diviser le probl\u00e8me en sous-fonctions. Cela semble plus lisible \u00e0 pr\u00e9sent avec : lecture de fichier avec def read_ext_file () et def generate_content () , une seule macro IDE avec deux modes ('v' et 'h' par d\u00e9faut). Palette Ideas // __md_scope=new URL(\".\",location) // __md_get=(e, =localStorage,t=__md_scope)=>JSON.parse( .getItem(t.pathname+\".\"+e)) // console.log('BLAM', __md_scope) // console.log('localStorage', localStorage) // console.log('localStorage 2', __md_scope.pathname+\".\"+\"__palette\") // console.log('localStorage 3', localStorage.getItem(__md_scope.pathname+\".\"+\"__palette\")) // console.log('localStorage 4', __md_get(\"__palette\").index, __md_get(\"__palette\").color.scheme)","title":"Des questions techniques et m\u00e9taphysiques"},{"location":"todo/#des-questions-techniques-et-metaphysiques","text":"","title":"Des questions techniques et m\u00e9taphysiques"},{"location":"todo/#todo-list","text":":x: D\u00e9marrer le comptage des 5 essais avant r\u00e9v\u00e9lation du code si les premiers tests sont pass\u00e9s. :x: Autocompl\u00e9tion du code avec une touche simple (pas de Live autocompl\u00e9tion -_-) :x: La fen\u00eatre d\u2019\u00e9dition est r\u00e9serv\u00e9e au code de l\u2019\u00e9l\u00e8ve. Les premiers tests sont dans une fen\u00eatre coll\u00e9e, juste en dessous, visible mais non \u00e9ditable. Ils peuvent \u00eatre masqu\u00e9s/affich\u00e9s. :x: Am\u00e9lioration des performances d'affichage :x: t\u00e9l\u00e9charger tous les codes \u00e9crits dans les \u00e9diteurs de la page en un seul fichier :x: Doctests :white_check_mark: eval d\u00e9sactiv\u00e9 en fonction de la pr\u00e9sence du mot-cl\u00e9 SANS = 'eval,max' dans l'appel \u00e0 IDE(..., SANS = ...) . Prendre en compte les erreurs du cr\u00e9ateur SANS = 'eval, MaX , min' . :white_check_mark: Erreur d'assertions et gestion de crash de code Mode verbose pour les tests / mode simple Mode infini pour les tentatives :white_check_mark: sauvegarde des codes lors d'un rechargement de la page (oui!!!!) :white_check_mark: gestion des fichiers d'initialisation (pour les codes longs) :white_check_mark: Le code solution apparait dans le code source... A cacher d'une mani\u00e8re ou d'une autre :white_check_mark: Mode sombre / Mode clair (r\u00e9glage ind\u00e9pendant du choix de palette) :white_check_mark: Caract\u00e8res non-ASCII pour nom de fichier et contenu :white_check_mark: Fichier de remarque, <nom_du_truc>_rem.txt Solution en page externe pour les fichiers longs (exclue du menu de navigation avec le hack) Solution en menu d\u00e9roulant pour les fichiers courts :white_check_mark: Modifications des emoji par des svg classe :white_check_mark: Infobulles :white_check_mark: Chemins relatifs :white_check_mark: Nombre d'essais vari\u00e9s","title":"Todo list"},{"location":"todo/#en-developpement","text":"Inclure des fichiers externes avec macros fonctionnels Jinja syntax to include an external remark file, including an IDE to give the correction : {% include 'scripts/demo/demo2_rem.txt' %} This is the future of the online judge Can include automatically a correction. Needs lots of refactoring though \u23f3\u23f3\u23f3. REPL > IDE Une reprise compl\u00e8te de la d\u00e9nomination a \u00e9t\u00e9 faite. Les REPL s'appellent maintenant (et \u00e0 raison) IDE Merci Fred Leleu pour le travail suppl\u00e9mentaire \ud83d\ude0d . Fichiers javascripts C'est le bazar dans l'appel des fichiers JS. Si quelqu'un peut me mettre de l'ordre dans tout cela, je suis preneur ! J'ai repris l'organisation g\u00e9n\u00e9rale. C'est toujours un peu le bazar mais cela me semble acceptable. Importation automatique de module Pyodide propose un module micropip permettant de charger les modules manquants. Nous pourrions faire des interfaces graphiques \u00e0 l'aide de cela mais est-ce vraiment utile ? Evaluateur de code Avec l'utilisation du code de fjunier , nous pourrions int\u00e9grer un juge en ligne ? Utile ou non ? L'\u00e9valuateur de code est fonctionnel et permet de faire des benchmarks complexes. Le bouton du juge en ligne n'apparaitra que s'il existe un fichier de benchmark test_nom_de_script.py . Le corrig\u00e9 n'apparaitra que si un fichier de corr_nom_de_script.py est pr\u00e9sent. Il faudra cr\u00e9er un pipe pour g\u00e9n\u00e9rer automatiquement un fichier de benchmark depuis un script de corrig\u00e9. Javascript et IDE La solution avec le -1 dans main.py , discut\u00e9e dans le guide technique du IDE, est vraiment naze. Il faut trouver autre chose. Je devais vraiment dormir. On peut tout simplement ajouter une ligne dans le template Jinja2 main.html du custom_dir de mkdocs. Cela permet de charger le javascript n\u00e9cessaire au bon fonctionnement des IDE sans s'emb\u00eater. Boutons et IDE La solution avec le -1 dans main.py , discut\u00e9e dans le guide technique du IDE, est vraiment naze. Il faut trouver autre chose. Ajout de boutons permettant de t\u00e9l\u00e9charger les scripts \u00e9crits et t\u00e9l\u00e9verser les scripts disponibles localement. Evaluateur de code ajout\u00e9.","title":"En d\u00e9veloppement"},{"location":"todo/#partis-pris","text":"Namespace partag\u00e9 Je trouve ce mode tr\u00e8s pratique car on conserve nos fonctions et variables d'un terminal \u00e0 l'autre au cours d'une le\u00e7on. P\u00e9dagogiquement, c'est plus discutable car certaines variables seront initialis\u00e9es dans le Terminal 1 et utilis\u00e9es dans le Terminal 2. Cela cache la notion d'initialisation. IDE vertical Est-ce vraiment utile de les conserver ? Cela ralentit le chargement de la page web et consomme des ressources pour l'auto-redimensionnement de la partie terminal du IDE. Cela est sp\u00e9cialement visible sur mobile (ou ce mode est d'ailleurs inutile). Quelques modifications ont permis de les conserver sans alt\u00e9rer les performances. macro Python Ma solution est un peu sale mais a-t-on vraiment le choix avec l'inclusion de balise HTML ? J'ai choisi de diviser le probl\u00e8me en sous-fonctions. Cela semble plus lisible \u00e0 pr\u00e9sent avec : lecture de fichier avec def read_ext_file () et def generate_content () , une seule macro IDE avec deux modes ('v' et 'h' par d\u00e9faut). Palette Ideas // __md_scope=new URL(\".\",location) // __md_get=(e, =localStorage,t=__md_scope)=>JSON.parse( .getItem(t.pathname+\".\"+e)) // console.log('BLAM', __md_scope) // console.log('localStorage', localStorage) // console.log('localStorage 2', __md_scope.pathname+\".\"+\"__palette\") // console.log('localStorage 3', localStorage.getItem(__md_scope.pathname+\".\"+\"__palette\")) // console.log('localStorage 4', __md_get(\"__palette\").index, __md_get(\"__palette\").color.scheme)","title":"Partis pris"},{"location":"scripts/exo2_REM/","text":"Remarque sur la solution C'est simple mais il faut \u00eatre vigilant. Une autre remarque est possible Toujours simple mais toujours vigilant.","title":"exo2 REM"},{"location":"scripts/demo/algo_glouton_REM/","text":"Titre de commentaire C'est un test de commentaire","title":"algo glouton REM"},{"location":"scripts/demo/demo1_REM/","text":"Remarque Ceci est un exemple complexe de remarque. La premi\u00e8re ligne du fichier de remarque doit \u00eatre vide La syntaxe markdown est compl\u00e8tement pr\u00e9serv\u00e9e. Par exemple, un tableau : a b c 1 2 3 Une admonition ? Vous pouvez inclure des admonitions et des superfences dans vos remarques.","title":"demo1 REM"},{"location":"scripts/demo/demo2_REM/","text":"Des admonitions en remarque On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can. Toujours plus On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can. Encore On peut vraiment le faire ! Pour de vrai ! Yes, we can. Oh yes, we can.","title":"demo2 REM"},{"location":"scripts/dentiste/exo_REM/","text":"Une premi\u00e8re remarque Ceci est un exercice classique. D'autres d\u00e9tails On pourrait repr\u00e9senter la situation dans un tableau : a b c 1 2 3","title":"exo REM"},{"location":"scripts/dentiste/sujet/","text":"\u00c9locution chez le dentiste \u2693\ufe0e Chez le dentiste, la bouche grande ouverte, lorsqu'on essaie de parler, il ne reste que les voyelles. M\u00eame les ponctuations sont supprim\u00e9es. Vous devez \u00e9crire une fonction dentiste(texte) qui renvoie un texte ne contenant que les voyelles de texte , dans l'ordre. Les voyelles sont donn\u00e9es par : voyelles = [ 'a' , 'e' , 'i' , 'o' , 'u' , 'y' ] On ne consid\u00e8rera que des textes \u00e9crits en minuscules, sans accents. Exemples >>> dentiste ( \"j'ai mal\" ) 'aia' >>> dentiste ( \"il fait chaud\" ) 'iaiau' >>> dentiste ( \"\" ) '' Lancer # testsbksl-nlbksl-nlassert dentiste(\"j'ai mal\") == 'aia'bksl-nlassert dentiste(\"il fait chaud\") == 'iaiau'bksl-nlassert dentiste(\"\") == ''bksl-nlbksl-nlbksl-nl# pas d'autres testsbksl-nlbksl-nlassert dentiste(\"a\"py-str20 + \"b\"py-str10 + \"e\") == 'a'py-str20 + 'e'bksl-nlassert dentiste(\"b\"py-str10 + \"e\" + \"a\"py-str20) == 'e' + 'a'py-str20 bksl-nlassert dentiste(\"ab\"py-str10) == 'a'py-str10bksl-nlassert dentiste(\"aeiouy\"py-str10) == 'aeiouy'py-str10bksl-nlassert dentiste(\"z\"py-str100 + 'y') == 'y'bksl-nlbksl-nl Valider 5/5 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder voyelles = ['a', 'e', 'i', 'o', 'u', 'y']bksl-nlbksl-nldef dentiste(texte):bksl-nl passbksl-nlbksl-nlassert dentiste(\"j'ai mal\") == 'aia'bksl-nlassert dentiste(\"il fait chaud\") == 'iaiau'bksl-nlassert dentiste(\"\") == ''bksl-nlbksl-nl voyelles = ['a', 'e', 'i', 'o', 'u', 'y']bksl-nlbksl-nldef dentiste(texte):bksl-nl resultat = ''bksl-nl for lettre in texte:bksl-nl if lettre in voyelles:bksl-nl resultat = resultat + lettrebksl-nl return resultatbksl-nlbksl-nl A Une premi\u00e8re remarque Ceci est un exercice classique. D'autres d\u00e9tails On pourrait repr\u00e9senter la situation dans un tableau : a b c 1 2 3 Z","title":"Dentiste"},{"location":"scripts/dentiste/sujet/#elocution-chez-le-dentiste","text":"Chez le dentiste, la bouche grande ouverte, lorsqu'on essaie de parler, il ne reste que les voyelles. M\u00eame les ponctuations sont supprim\u00e9es. Vous devez \u00e9crire une fonction dentiste(texte) qui renvoie un texte ne contenant que les voyelles de texte , dans l'ordre. Les voyelles sont donn\u00e9es par : voyelles = [ 'a' , 'e' , 'i' , 'o' , 'u' , 'y' ] On ne consid\u00e8rera que des textes \u00e9crits en minuscules, sans accents. Exemples >>> dentiste ( \"j'ai mal\" ) 'aia' >>> dentiste ( \"il fait chaud\" ) 'iaiau' >>> dentiste ( \"\" ) '' Lancer # testsbksl-nlbksl-nlassert dentiste(\"j'ai mal\") == 'aia'bksl-nlassert dentiste(\"il fait chaud\") == 'iaiau'bksl-nlassert dentiste(\"\") == ''bksl-nlbksl-nlbksl-nl# pas d'autres testsbksl-nlbksl-nlassert dentiste(\"a\"py-str20 + \"b\"py-str10 + \"e\") == 'a'py-str20 + 'e'bksl-nlassert dentiste(\"b\"py-str10 + \"e\" + \"a\"py-str20) == 'e' + 'a'py-str20 bksl-nlassert dentiste(\"ab\"py-str10) == 'a'py-str10bksl-nlassert dentiste(\"aeiouy\"py-str10) == 'aeiouy'py-str10bksl-nlassert dentiste(\"z\"py-str100 + 'y') == 'y'bksl-nlbksl-nl Valider 5/5 T\u00e9l\u00e9charger T\u00e9l\u00e9verser Recharger Sauvegarder voyelles = ['a', 'e', 'i', 'o', 'u', 'y']bksl-nlbksl-nldef dentiste(texte):bksl-nl passbksl-nlbksl-nlassert dentiste(\"j'ai mal\") == 'aia'bksl-nlassert dentiste(\"il fait chaud\") == 'iaiau'bksl-nlassert dentiste(\"\") == ''bksl-nlbksl-nl voyelles = ['a', 'e', 'i', 'o', 'u', 'y']bksl-nlbksl-nldef dentiste(texte):bksl-nl resultat = ''bksl-nl for lettre in texte:bksl-nl if lettre in voyelles:bksl-nl resultat = resultat + lettrebksl-nl return resultatbksl-nlbksl-nl A Une premi\u00e8re remarque Ceci est un exercice classique. D'autres d\u00e9tails On pourrait repr\u00e9senter la situation dans un tableau : a b c 1 2 3 Z","title":"\u00c9locution chez le dentiste"},{"location":"xtra/end_REM/","text":"Z","title":"end REM"},{"location":"xtra/start_REM/","text":"A","title":"start REM"}]}