{"cells":[{"metadata":{"init_cell":true,"run_control":{"marked":false},"hide_output":true,"hide_input":true,"trusted":true},"cell_type":"code","source":"# Permet de tout executer au lancement du notebook + conserver le notebook actif pendant 2h\nfrom IPython.display import Javascript\nfrom masquer import *\nJavascript(\"\"\"\nfunction repeter(){\nIPython.notebook.kernel.execute(\"a=1\");\n}\n// execute a = 1 en python toutes les 8 minutes pendant 2h\nlet timerId = setInterval(() => repeter(), 4800);\nsetTimeout(() => { clearInterval(timerId); alert('fin de cession'); }, 7200000);\n\n// Supprimer la taille limite pour la sortie d'une cellule\nIPython.OutputArea.prototype._should_scroll = function(lines) {\n return false;\n};\nIPython.notebook.kernel.execute(\"url = '\" + window.location + \"'\");\n\n// Exécuter toutes les cellule du notebook\n require(\n ['base/js/namespace', 'jquery'], \n function(jupyter, $) {\n \n \n jupyter.actions.call('jupyter-notebook:run-all-cells-below');\n jupyter.actions.call('jupyter-notebook:save-notebook');\n Jupyter.actions.call('jupyter-notebook:hide-header')\n\n }\n );\"\"\")","execution_count":2,"outputs":[{"output_type":"execute_result","execution_count":2,"data":{"text/plain":"","application/javascript":"\nfunction repeter(){\nIPython.notebook.kernel.execute(\"a=1\");\n}\n// execute a = 1 en python toutes les 8 minutes pendant 2h\nlet timerId = setInterval(() => repeter(), 4800);\nsetTimeout(() => { clearInterval(timerId); alert('fin de cession'); }, 7200000);\n\n// Supprimer la taille limite pour la sortie d'une cellule\nIPython.OutputArea.prototype._should_scroll = function(lines) {\n return false;\n};\nIPython.notebook.kernel.execute(\"url = '\" + window.location + \"'\");\n\n// Exécuter toutes les cellule du notebook\n require(\n ['base/js/namespace', 'jquery'], \n function(jupyter, $) {\n \n \n jupyter.actions.call('jupyter-notebook:run-all-cells-below');\n jupyter.actions.call('jupyter-notebook:save-notebook');\n Jupyter.actions.call('jupyter-notebook:hide-header')\n\n }\n );"},"metadata":{}}]},{"metadata":{"run_control":{"marked":false},"hide_input":true,"hide_output":true,"trusted":true},"cell_type":"code","source":"HTML(\"\"\"\"\"\")","execution_count":3,"outputs":[{"output_type":"execute_result","execution_count":3,"data":{"text/plain":"","text/html":""},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"# TD_01_1 : Structures de données"},{"metadata":{},"cell_type":"markdown","source":"## Exercice I : Notation postfixe"},{"metadata":{},"cell_type":"markdown","source":"L'écriture des expressions arithmétiques nécessite souvent l'emploi de parenthèses. Par exemple:\n$$9 + 4 * (7 + 2) * (4 + 5)$$\nLa notation **postfixe** ou **notation polonaise inverse** permet d'écrire de façon non ambiguë les formules arithmétiques sans utiliser de parenthèses. L'expression précédente en notation polonaise inverse devient:\n$$ 9\\ 4\\ 7\\ 2\\ +\\ *\\ 4\\ 5\\ +\\ *\\ +$$\n\n\nDérivée de la notation polonaise utilisée pour la première fois en 1924 par le mathématicien polonais **Jan Łukasiewicz**, la NPI a été inventée par le philosophe et informaticien australien **Charles Leonard Hamblin** dans le milieu des années 1950, pour permettre les calculs sans faire référence à une quelconque adresse mémoire.\n\nÀ la fin des années 1960, elle a été diffusée dans le public comme interface utilisateur avec les calculatrices de bureau de Hewlett-Packard (HP-9100), puis avec la calculatrice scientifique HP-35 en 1972. [source](https://fr.wikipedia.org/wiki/Notation_polonaise_inverse)\n\n\nUne expression en NPI est évaluée de la gauche vers la droite. Dès qu'un opérateur est rencontré, il est appliqué aux deux opérandes immédiatement à sa gauche. Le résultat remplace alors l'operation dans l'expression postfixe et on pousuit l'évaluation.\nAinsi l'expression precedente devient:\n$$ 9\\ 4\\ 7\\ 2\\ +\\ *\\ 4\\ 5\\ +\\ *\\ +$$\n$$ 9\\ 4\\ 9\\ *\\ 4\\ 5\\ +\\ *\\ +$$\n$$ 9\\ 36\\ 4\\ 5\\ +\\ *\\ +$$\n$$ 9\\ 36\\ 9\\ *\\ +$$\n$$ 9\\ 324\\ +$$\n$$ 333$$\nA la fin, si l'expression est valide, il ne reste qu'une valeur numérique dans l'expression qui est le résultat.\n"},{"metadata":{},"cell_type":"markdown","source":"1. Comment s'écrit (3 + (4 + (5 + (6 + (7 + (8 + 9)))))) en NPI ?"},{"metadata":{},"cell_type":"markdown","source":"***Répondre ici***"},{"metadata":{},"cell_type":"markdown","source":"On considère l'expression en NPI suivante: **3 4 5 6 7 8 9 + + + + + +**. Cette expression est donnée sous forme d'une liste, les valeurs chiffrées seront de type **int** et les opérateurs rentrés comme les chaînes de caractère **\"+\"**.\n2. Entrer dans une variable L la liste décrite précédemment."},{"metadata":{"run_control":{"marked":false},"trusted":true},"cell_type":"code","source":"# question 2\n","execution_count":4,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"3. Ecrire les fonctions **init, isEmpty, push et pop** permettant d'avoir un comportement de pile. Vous ajouterez aussi une fonction **top** permettant de lire l'élément au sommet de la pile sans la modifier."},{"metadata":{"run_control":{"marked":false},"trusted":true},"cell_type":"code","source":"# question 3\n","execution_count":5,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"4. Ecrire une fonction **evalue** qui prend comme argument une liste comme décrit ci-dessus. Cette fonction doit:\n - initialiser une **pile** pour le calcul\n - balayer la liste de gauche à droite\n - lorsqu'on rencontre une valeur chiffrée, on l'empile\n - lorsqu'on rencontre un opérateur, on dépile deux éléments, on calcule et on empile le résultat.\n - renvoyer le résultat final"},{"metadata":{"run_control":{"marked":false},"trusted":true},"cell_type":"code","source":"# question 4\n","execution_count":6,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Exercice 2 : Le labyrinthe"},{"metadata":{},"cell_type":"markdown","source":"Un labyrinthe est dit parfait si:\n- il existe un chemin menant de tout point du labyrinthe à tout autre\n- et si ce chemin est unique.\n\nNous allons construire de tels labyrinthes de manière aléatoire en utilisant une structure de pile.\n\n\nUn labyrinthe sera représenté par un rectangle de largeur **l** et de hauteur **h** contenant **$l \\times h$** cases carrées blanches ou noires. Une case blanche représentant un chemin et une case noire représentant un mur.\n\n\nNous travaillerons d'abord sur une matrice contenant uniquement des **1** (cases blanches) et des **0** (cases noires). puis dans un deuxième temps sur l'affichage.\n\n"},{"metadata":{},"cell_type":"markdown","source":"1. Ecrire une fonction **init** qui prend comme arguments deux entiers **l** et **h** et qui renvoie la matrice correspondante contenant uniquement des 0."},{"metadata":{"run_control":{"marked":false},"trusted":true},"cell_type":"code","source":"# question 1\n","execution_count":7,"outputs":[]},{"metadata":{"run_control":{"marked":false},"hide_input":true,"trusted":true},"cell_type":"code","source":"cacher_code(\"exemple de solution\")","execution_count":8,"outputs":[{"output_type":"execute_result","execution_count":8,"data":{"text/plain":"","text/html":"\n \n\n exemple de solution \n "},"metadata":{}}]},{"metadata":{"run_control":{"marked":false},"hide_input":true,"trusted":true},"cell_type":"code","source":"def init2(l=51,h=51):\n return [[0 for i in range(l)] for j in range(h)]\n","execution_count":9,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. Ecrire une fonction **blanchir** qui prend comme paramètre deux arguments, la carte et un couple d'entier correspondant aux coordonnées de la case à blanchir."},{"metadata":{"run_control":{"marked":false},"trusted":true},"cell_type":"code","source":"# question 2\n","execution_count":10,"outputs":[]},{"metadata":{"run_control":{"marked":false},"hide_input":true,"trusted":true},"cell_type":"code","source":"cacher_code(\"exemple de solution\")","execution_count":11,"outputs":[{"output_type":"execute_result","execution_count":11,"data":{"text/plain":"","text/html":"\n \n\n exemple de solution \n "},"metadata":{}}]},{"metadata":{"run_control":{"marked":false},"hide_input":true,"trusted":true},"cell_type":"code","source":"def blanchir2(carte, coord):\n x,y = coord\n carte[y][x] = 1","execution_count":12,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"3. Ecrire une fonction **estBlanc** qui prend comme paramètre deux arguments, la carte et un couple d'entier correspondant aux coordonnées de la case testée. Cette fonction doit renvoyer un booléen. Si la case considérée est hors de la carte, elle doit renvoyer True."},{"metadata":{"run_control":{"marked":false},"trusted":true},"cell_type":"code","source":"# question 3\n","execution_count":13,"outputs":[]},{"metadata":{"run_control":{"marked":false},"hide_input":true,"trusted":true},"cell_type":"code","source":"cacher_code(\"exemple de solution\")","execution_count":14,"outputs":[{"output_type":"execute_result","execution_count":14,"data":{"text/plain":"","text/html":"\n \n\n exemple de solution \n "},"metadata":{}}]},{"metadata":{"run_control":{"marked":false},"hide_input":true,"trusted":true},"cell_type":"code","source":"def estBlanc2(carte, coord):\n x,y = coord\n if x < 0 or y < 0 or y>=len(carte) or x >=len(carte[0]):\n return True\n return carte[y][x] == 1","execution_count":15,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"4. Ecrire une fonction **voisins** qui prend comme paramètre la carte courante et les coordonnées d'une case. Cette fonction doit renvoyer la liste des couples de coordonnées des cases encore noires à une distance de 2 cases de la case considérée."},{"metadata":{"run_control":{"marked":false},"trusted":true},"cell_type":"code","source":"# question 4\n","execution_count":16,"outputs":[]},{"metadata":{"run_control":{"marked":false},"trusted":true,"hide_input":true},"cell_type":"code","source":"cacher_code(\"exemple de solution\")","execution_count":17,"outputs":[{"output_type":"execute_result","execution_count":17,"data":{"text/plain":"","text/html":"\n \n\n exemple de solution \n "},"metadata":{}}]},{"metadata":{"run_control":{"marked":false},"hide_input":true,"trusted":true},"cell_type":"code","source":"def voisins2(carte, coord):\n x,y = coord\n l = []\n if not estBlanc2(carte,(x-2,y)):\n l.append((x-2,y))\n if not estBlanc2(carte,(x+2,y)):\n l.append((x+2,y))\n if not estBlanc2(carte,(x,y-2)):\n l.append((x,y-2))\n if not estBlanc2(carte,(x,y+2)):\n l.append((x,y+2))\n return l","execution_count":18,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"5. Ecrire une fonction **milieu** qui prend comme paramètre les coordonnées de deux cases séparées par une seule et qui renvoie les coordonnées de cette case."},{"metadata":{"run_control":{"marked":false},"trusted":true},"cell_type":"code","source":"# question 5\n","execution_count":19,"outputs":[]},{"metadata":{"run_control":{"marked":false},"hide_input":true,"trusted":true},"cell_type":"code","source":"cacher_code(\"exemple de solution\")","execution_count":20,"outputs":[{"output_type":"execute_result","execution_count":20,"data":{"text/plain":"","text/html":"\n \n\n exemple de solution \n "},"metadata":{}}]},{"metadata":{"run_control":{"marked":false},"hide_input":true,"trusted":true},"cell_type":"code","source":"def milieu2(coord1,coord2):\n x1, y1 = coord1\n x2, y2 = coord2\n x, y = (x1 + x2)//2, (y1 + y2)//2\n return (x, y)","execution_count":21,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"6. Ecrire une fonction **choix** qui prend comme argument une liste de cases et qui en renvoie une prise au hasard. Vous pourrez utiliser la bibliothèque **random** ainsi que sa documentation accessible avec la fonction **help** afin de choisir la bonne fonction."},{"metadata":{"run_control":{"marked":false},"trusted":true},"cell_type":"code","source":"# question 6\n","execution_count":22,"outputs":[]},{"metadata":{"run_control":{"marked":false},"hide_input":true,"trusted":true},"cell_type":"code","source":"cacher_code(\"exemple de solution\")","execution_count":23,"outputs":[{"output_type":"execute_result","execution_count":23,"data":{"text/plain":"","text/html":"\n \n\n exemple de solution \n "},"metadata":{}}]},{"metadata":{"run_control":{"marked":false},"hide_input":true,"trusted":true},"cell_type":"code","source":"from random import choice\ndef choix2(l):\n return choice(l)\n","execution_count":24,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"L'algorithme utilise une structure de pile:\n1. On initialise une structure de pile vide\n2. On initialise une matrice ne contenant que des cases noires de dimension $l \\times h$\n2. Les coordonnées de la case de départ (1,1) sont empilées et on blanchit cette case\n3. tant que la pile est non vide\n * On fait la liste des cases accessibles à 2 cases de distance\n * Si la liste est vide\n * on dépile la case et on reprend à l'étape 4.\n * sinon\n * On en prend une case au hasard dans cette liste\n * On détermine les coordonnées de la case du milieu (entre celle tirée au hasard et la case courante)\n * On blanchit les 2 cases\n * On empile la case et on reprend à l'étape 4.\n4. On tire au hasard deux cases de la forme (0,2n+1) (2n+1,0) (l-1,2n+1) ou (2n+1,h-1) pour servir d'entrée et de sortie\n4. On renvoie la carte terminée\n\n\nVoici ce que cela donne dans une petite animation afin de mieux comprendre\n![test gif](laby.gif)"},{"metadata":{},"cell_type":"markdown","source":"7. Implémentez cet algorithme en python dans une fonction **maze**"},{"metadata":{"run_control":{"marked":false},"trusted":true},"cell_type":"code","source":"# question 7\n","execution_count":25,"outputs":[]},{"metadata":{"run_control":{"marked":false},"hide_input":true,"trusted":true},"cell_type":"code","source":"cacher_code(\"un exemple de solution\")","execution_count":26,"outputs":[{"output_type":"execute_result","execution_count":26,"data":{"text/plain":"","text/html":"\n \n\n un exemple de solution \n "},"metadata":{}}]},{"metadata":{"run_control":{"marked":false},"hide_input":true,"trusted":true},"cell_type":"code","source":"# question 7\ndef maze2(l,h):\n data = [] # etape 1.\n carte = init2(l,h) # etape 2.\n data.append((1,1)) # etape 3.\n blanchir2(carte,(1,1)) # etape 3.\n while data != []: # etape 4.\n lv = voisins2(carte,data[-1]) # etape 4.1\n if lv == []: # condition 4.2\n data.pop() # 4.2.1\n else: # condition 4.3\n coord = choix2(lv) # 4.3.1\n coord2 = milieu2(data[-1],coord) # 4.3.2\n blanchir2(carte,coord) # 4.3.3\n blanchir2(carte,coord2) # 4.3.3\n data.append(coord) # 4.3.4\n #etape 5.\n blanchir2(carte,random.choice(random.choice([[(0,2*i+1),(2*i+1,0),(l-1,2*i+1),(2*i+1,h-1)] for i in range(l//2)])))\n blanchir2(carte,random.choice(random.choice([[(0,2*i+1),(2*i+1,0),(l-1,2*i+1),(2*i+1,h-1)] for i in range(l//2)])))\n return carte # etape 6.","execution_count":27,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Voici quelques lignes de code pour tester votre fonction et afficher l'image correspondante, vous pouvez ajuster l et h mais gardez bien un nombre impair! L'affichage doit changer à chaque appel du bloc car un nouveau labyrinthe aléatoire est généré. Vous pourrez même récupérer le fichier image si vous le souhaitez."},{"metadata":{"run_control":{"marked":false},"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\nim = plt.imshow(maze2(51,51),interpolation='none')\nim.set_cmap('gray')\nplt.axis(False)\nplt.savefig('monlabyrinthe.png')\nplt.show()","execution_count":28,"outputs":[{"output_type":"display_data","data":{"text/plain":"
","image/png":"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\n"},"metadata":{"needs_background":"light"}}]},{"metadata":{},"cell_type":"markdown","source":"## Exercice 3 : Suite de l'exercice 2 pour les plus rapides"},{"metadata":{},"cell_type":"markdown","source":"8. Ecrire une fonction **solve** qui prend comme argument une carte de labyrinthe (comme la renvoie la fonction maze). Cette fonction devra résoudre le labirynthe et construire une image sur laquelle la solution apparait."},{"metadata":{"run_control":{"marked":false},"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"9. Ecrire une fonction **save** qui prend comme entrée une carte et qui construit un fichier texte contenant:\nlargeur espace hauteur sur la première ligne (c'est l'entête)\nDes 0 et des 1 ensuite représentant les données à partir de la deuxième ligne. \n - les 0 et les 1 devront être collés sans espace. \n - Vous pourrez changer de ligne n'importe quand, il n'est pas obligatoire d'écrire une ligne du labyrinthe par ligne de fichier\nLa fonction devra sauvegarder votre fichier avec un nom raisonnable"},{"metadata":{"run_control":{"marked":false},"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"10. Ecrire une fonction **read** qui prend comme entrée le nom (avec extension!) d'un fichier labyrinthe sous forme d'une chaine de caractères. Votre fonction devra lire le fichier et renvoyer une carte sous forme de matrice (opération inverse de la fonction save)."},{"metadata":{"run_control":{"marked":false},"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"11. Construire un fichier labyrinthe, échanger ces fichiers labyrinthes avec un autre élève du groupe, lire le fichier (éventuellement corriger votre fonction **read**) et résoudre le labyrinthe."}],"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.7.8","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"celltoolbar":"None"},"nbformat":4,"nbformat_minor":4}