TDs - Nicolas Bourgeois
Transcription
TDs - Nicolas Bourgeois
Feuilles de TD Informatique MIASHS L2S3 Nicolas Bourgeois — les exercices sont à rédiger dans des fichiers au nom explicite (par exemple LouiseMichelTD1Exo1.py s’il s’agit d’un script et JulesVallesTD3Exo2.txt s’il ne s’agit pas de programmation). — seuls les exercices de la première section de chaque séance peuvent (en plus de questions de cours) donner lieu à évaluation, aussi bien en contrôle continu que pour le partiel. — les problèmes constituent en revanche la partie la plus intéressante de ce cours. Bien qu’ils ne soient pas évalués, il est fortement recommandé aux élèves souhaitant apprendre à programmer de les travailler tous. 1 1.1 Séance 1 - Introduction au langage Rappels de syntaxe En python 3, on utilise la fonction print() pour l’affichage console et input() pour poser une question. type() permet d’obtenir le type d’une variable et eval() de transtyper une chaîne en nombre. La division euclidienne s’effectue avec "//" et le modulo avec "%". La fonction max() renvoie le maximum d’un uple d’entiers mais n’a pas le comportement attendu pour des caractères. 1.2 Exercices notés Exercice 1 Affichez les nombres de 1 à 40. Exercice 2 Affichez les nombres de 1 à 40 divisibles par 3 ou 5. Exercice 3 Demandez la saisie d’un nombre. Testez si ce nombre est premier (c’est-à-dire n’ayant d’autre diviseur que 1 et lui-même). Exercice 4 Affichez les nombres premiers de 1 à 40. Exercice 5 Demandez la saisie de deux mots. Si ce sont des nombres, affichez leur maximum ; sinon le premier dans l’ordre lexicographique. 1.3 Exercices libres Problème 1 (Exponentiation rapide) a) implémentez une méthode naïve permettant de calculer 1.0574145 en utilisant 144 multiplications. b) décomposez 145 en une somme de puissances de 2. c) utilisez la décomposition binaire vue ci-dessus pour calculer 1.0574145 en utilisant seulement 9 multiplications. 1 d) généralisez au calcul de ab . Indice : on pourra commencer par calculer un i tableau des a2 pour i < log2 (b) Problème 2 (Ensembles) a) Considérons un ensemble à X éléments, par exemple toutes les lettres de l’alphabet. Proposez une façon de coder chaque sous-ensemble en utilisant simplement un entier. Par exemple {A, F, G} pourra être codé par 20 +25 +26 = 97. b) Prouvez que ce codage est bien bijectif (exactement un entier par ensemble) et écrivez un programme qui demande un entier et affiche les lettres associées. c) Proposez des programmes permettant de calculer l’union, l’intersection, la différence symétrique de deux sous-ensembles. 2 2.1 Séance 2 - Fonctions et listes Rappels de syntaxe Une fonction est déclarée par l’instruction def et son retour par return(). Les listes peuvent être définies par une fonction en utilisant une boucle for. len() permet de connaître la taille et enumerate() d’itérer les éléments. 2.2 Exercices notés Exercice 6 Créez une fonction factorielle(n) sans utiliser la librairie math. Exercice 7 Utilisez votrefonction factorielle pour créer une fonction combin! . naison(n,p) qui renvoie np = p!(n−p)! Exercice 8 Créez la liste des valeurs de la fonction 2n pour n variant de 0 à 40. Exercice 9 Créez la matrice des valeurs de la fonction combinaison(n,p) pour n variant de 0 à 40 et p variant de 0 à n. Exercice 10 Créez (à la main, sans utiliser max) une fonction maximum(l) qui renvoie le maximum d’une liste d’entiers. Utilisez-là pour trier une liste. 2.3 Exercices libres Problème 3 a) créez une fonction fib(n) qui renvoie le n-ieme terme de la suite de Fibonacci définie par la récurrence fib(0)=fib(1)=1 et ∀n fib(n+2) = fib(n+1) + fib(n). b) à l’aide des fonctions fib(n) et combinaison(n,p),vérifiez que pour les entiers de 0 à 40, dans le triangle de Pascal, les trois suivantes sont vraies : P affirmations — la somme des nombres d’une ligne 0≤i≤n ni vaut 2n . P — la somme partielle des premiers nombres d’une colonne i≤j≤n ji vaut n+1 i+1 . P — la somme des nombres d’une diagonale 0≤i≤n/2 n−i est égale au ni ième terme de la suite de Fibonacci. 2 1 1 1 1 1 1 1 1 2 3 4 5 6 1 3 6 10 15 φ6 = 13 1 4 1 10 5 1 20 15 6 1 Figure 1 – Triangle de Pascal et nombres de Fibonacci Problème 4 (Sac à dos) Prenez en entrée une liste de 20 items définis par un couple (poids,valeur), par exemple stock = ((2, 5), (3, 7), (8, 4), . . .). a) calculez le poids total de l’ensemble des items W. Supposons que nous avons un sac à dos de capacité W/2 que nous voulons remplir avec des items de valeur la plus grande possible. Maintenant nous allons implémenter une méthode qui renvoie une sous-liste x de stock dont le poids est inférieur à W/2 mais tel qu’il n’est plus possible de rajouter un autre item sans que le poids ne dépasse W/2. Une telle liste est dite maximale. b) proposez une fonction (naïve) qui construit x en ajoutant les éléments dans l’ordre de la liste tant que c’est possible. c) proposez une fonction (gloutonne) qui construit x en ajoutant les éléments par ordre décroissant de valeur tant que c’est possible. d) proposez une fonction (exhaustive) qui construit toutes les sous-listes maximales possibles et renvoie celle dont la valeur totale est la plus grande. e) comparez les valeurs totales des sous-listes construites en b, c et d. f ) réfléchissez à une méthode qui permette d’obtenir la sous-liste maximale de plus grande valeur totale sans avoir à explorer toutes les possibilités. 3 Séance 3 - Rappels Reprise d’exercices et de problèmes des séances 1 et 2 4 4.1 Séance 4 - Analyse d’algorithmes Rappels de cours Pour mesurer des temps de calcul effectifs on peut utiliser time (ou préférentiellement perf_counter si la version de python est récente) de la librairie time. Sauf précision opposée, c’est la complexité asymptotique au pire des cas qui est demandée, pas le temps expérimental. On utilise la notation O() pour signifier un comportement asymptotique. O(n4 ) signifie que la complexité de l’algorithme peut être majorée par une constante multipliée par n4 . 3 4.2 Exercices notés Exercice 11 Calculez la complexité d’une multiplication matricielle. Exercice 12 Calculez la complexité de l’algorithme de tri que vous avez réalisé lors du TD2. Exercice 13 Calculez la complexité respective de l’exponentiation naïve et de l’exponentiation rapide définies dans le premier problème du TD1. Exercice 14 Réalisez un algorithme qui à partir d’une liste d’entiers de somme N détermine s’il existe une sous-liste de somme N/2. Donnez sa complexité. Exercice 15 Utlisez un timer pour comparer le temps d’exécution pratique des algorithmes mentionnés dans les 4 exos précédents sur une instance de taille 200. 4.3 Exercices libres 2 3 1 4 Figure 2 – Le graphe ((1,2),(2,3),(3,4),(1,4)) Problème 5 (Graphes et connexité) On modélise un graphe par une liste de couples qui forment ses arêtes (non orientées). Par exemple g1 = ((1, 2), (2, 3), (3, 4), (1, 4)) représente un carré de sommets 1,2,3 et 4. On appelle chemin entre deux sommets un ensemble d’arêtes incidentes (c’est-à-dire consécutives) qui les relient. Par exemple, dans g1, ((1, 2), (2, 3)) est un chemin entre 1 et 3. On peut aussi représenter ce même chemin en donnant la liste des sommets consécutifs au lieu des arêtes - ici (1, 2, 3) - c’est équivalent. Notre but est de déterminer si un graphe est connexe ou s’il est composé de plusieurs composantes distinctes. a) proposez une fonction voisins(u,g) qui renvoie la liste des voisins d’un sommet u dans un graphe g. Donnez sa complexité. b) proposez une fonction voisinsliste(l,g) qui à partir d’une liste (sans doublon) de sommets l renvoie la liste (sans doublon) contenant les sommets qui sont, soit dans l, soit voisins d’au moins un sommet de l. Donnez sa complexité. c) proposez un algorithme utilisant voisinsliste(l,g) et permettant de déterminer si un graphe est connexe. d) réfléchissez à une méthode plus rapide pour déterminer si un graphe est connexe. Problème 6 (Chemin hamiltonien) Dans un graphe, un chemin hamiltonien est un chemin qui passe une et une seule fois par tous les points d’un graphe. Autrement dit, c’est une permutation 4 2 3 1 4 5 2 3 1 4 5 Figure 3 – Un graphe hamiltonien et un graphe non hamiltonien de l’ensemble des sommets. Notre but est de déterminer si un graphe contient un chemin hamiltonien. a) Les graphes ((1, 2), (2, 3), (2, 4), (3, 5)) et ((1, 2), (2, 3), (2, 4), (3, 5), (4, 5)) contiennent-ils des chemins hamiltoniens ? b) proposez une fonction valide(l,g) qui vérifie que la liste de sommets l constitue bien un chemin valide dans g. Par exemple (1, 5, 4) est un chemin valide dans g2 = ((1, 5), (2, 3), (4, 5)). c) proposez une fonction permutations(n) qui génère sous forme de listes toutes les permutations de n sommets. d) à partir de permutations(n) et valide(l,g), proposez un algorithme qui teste s’il existe un chemin hamiltonien dans un graphe g de taille n. Quelle est sa complexité ? e) [difficile] On remarque qu’il existe un chemin hamiltonien dans un graphe g de taille n terminant par un sommet donné u si et seulement si il existe un chemin hamiltonien dans le graphe g privé de u terminant par v et une arrête (v,u) dans g. Réfléchissez à utiliser cette récurrence pour trouver un algorithme de complexité 3n . 5 5.1 Séance 5 - Structures de données Rappels de syntaxe Sur une liste, on peut utiliser append() ou insert() pour ajouter des éléments. split() permet de séparer dans une liste des parties d’une chaîne et join() de rejoindre dans une chaîne les éléments d’une liste, à chaque fois en précisant un séparateur. Les éléments des dictionnaires peuvent être ajoutés directement en associant une valeur à une clef, et supprimés avec la fonction del(). Les sets ont une méthode add() et une méthode remove(). 5.2 Exercices notés Exercice 16 Proposez une fonction lettres(s) qui renvoie la liste des lettres d’une chaîne de caractères s. Exercice 17 Proposez une fonction phrase(l) qui à partir d’une liste l de mots renvoie une unique chaîne de caractères concaténant ces mots séparés par des espaces. Exercice 18 Proposez une fonction comptage(l) qui à partir d’une liste de mots renvoie un dictionnaire associant chaque mot à son nombre de lettres. 5 Exercice 19 Proposez une fonction successeurs(l) qui à partir d’un graphe donné sous forme d’une liste d’arêtes l renvoie un graphe donné sous la forme d’un dictionnaire associant à chaque sommet la liste de ses voisins. Exercice 20 Soient un graphe g1 donné sous forme de liste d’arêtes et un graphe g2 donné sous forme de dictionnaire de successeurs. Dans chacun des cas proposez une fonction permettant de vérifier si un sommet fait partie d’un triangle. 5.3 Exercices libres 1 2 4 3 5 6 Figure 4 – Un arbre binaire Problème 7 (Arbres binaires) Un arbre est un graphe sans cycle. On peut aussi se le représenter de la façon suivante : un nœud initial, appelé racine, ayant des enfants, eux même ayant des enfants, jusqu’aux sommets terminaux appelés feuilles. On peut donc définir des lignes (ou niveaux de profondeur) : la racine est la ligne 0, ses enfants la ligne 1, etc. Un arbre binaire est un arbre tel que tout sommet sauf les feuilles ait exactement deux enfants. a) Combien y a-t-il de sommets au maximum par ligne dans un arbre binaire ? Prouvez qu’il est toujours possible d’attribuer le numéro 2i + (j − 1) au j-eme sommet de la i-eme ligne. b) Écrivez un exemple d’arbre binaire d’une dizaine de sommets sous forme de dictionnaire de successeurs. Quelle relation mathématique relie nécessairement le numéro d’un sommet à celui de ses enfants ? c) Déduisez des questions précédentes une façon de représenter un arbre binaire sous forme d’une simple liste de 0 et de 1. d) Proposez deux méthodes descendants(u) permettant de calculer le nombre de sommets dans le sous-arbre de racine u, la première en donnant l’arbre initial sous forme de dictionnaire, la seconde en utilisant la représentation proposée en c). Comparez leur complexité. 6 Séance 6 - Interro Examen de contrôle continu, à la charge du/de la chargé-e de TD. 6 7 7.1 Séance 7 - Expressions régulières Rappels de syntaxe La bibliothèque des expressions rationnelles est re. On y trouve en particulier search/findall (trouver un/tous les motifs) et sub (extraire et remplacer un motif). Quelques expressions rationnelles : n’importe quel caractère . [A-F] une lettre comprise entre A et F [ˆ4] tout sauf un 4 \s un caractère blanc (espace, tabulation) * répété plusieurs fois répété 0 ou 1 fois ? {2,7} répété entre 2 et 7 fois début / fin de ligne ˆ/$ () groupe 7.2 Exercices notés Exercice 21 En utilisant un affichage formaté, proposez un programme qui affiche l’heure (mise à jour) au format "Il est X heures Y minutes Z secondes " cent fois de suite, où X,Y sont des entiers et Z un décimal à 2 chiffres après la virgule. Exercice 22 Proposez une fonction hascap(s) qui renvoie tous les mots de la chaîne s contenant une majuscule. Exercice 23 Proposez une fonction inflation(s) qui dans la chaîne s double la valeur de tous les nombres. Par exemple "Le prix est de 27 euros" devient "Le prix est de 54 euros". Exercice 24 Proposez une fonction lines(s) qui à partir d’une longue chaîne s (>100 caractères) renvoie un tableau de chaînes de caractères contenant chacune 24 caractères maximum et terminant par un espace (la chaîne initiale doit rester la concaténation exacte de toutes chaînes tu tableau : ne rajoutez pas d’espace artificiel !). Affichez ces chaînes ligne par ligne. Exercice 25 Proposez une fonction qui trie les éléments d’une liste de caractères et une autre qui trie les éléments d’une chaîne. Comparez leur temps d’exécution. 7.3 Exercices libres Problème 8 (Fouille de données) Dans cet exercice on appelle balise tout bloc de caractères compris entre les caractères < et >. a) Proposez une fonction balises2dico(t) qui renvoie un dictionnaire des balises issues d’une chaîne de caractères t, indexées par le numéro du caractère les précédant dans la chaîne expurgée des balises. Par exemple balises2dico("Bonjour chers <strong>camarades</strong> et amis") renvoie (13 => "<strong>",22 => "</strong>). 7 b) Proposez une fonction translate(t) qui supprime les balises d’un texte mais, lorsqu’un bloc de texte est compris entre une balise <h*> et </h*> où l’étoile est un chiffre (par exemple <h2>), fait passer ce bloc en capitales. c) Proposez une méthode xml2csv(t) qui prenne un argument un texte avec des balises xml et renvoie un tableau de données sous format csv avec des titres de colonnes. Par exemple, le texte : <individu><taille>173</taille><poids>68</poids></individu> <individu><taille>186</taille><poids>91</poids></individu> <individu><taille>159</taille><poids>57</poids></individu> deviendrait : taille,poids ; 173,68 ; 186,91 ; 159,57 ; Problème 9 (Automates) On appelle automate fini la donnée d’un ensemble d’états et de transitions conditionnelles entre ces états. On dit qu’un mot est reconnu par un automate si la suite de transitions définies par les lettres successives du mot amène à un état final. Ceci est très abstrait, mieux vaut donc regarder un exemple : non A e0 A e1 A e2 non A Figure 5 – Automate reconnaissant .*AA.* Par exemple, l’automate de la figure 5 effectue l’action suivante : 1. je commence à l’état 0. 2. si je lis A je passe à l’état 1 sinon je reste. 3. si je suis à l’état 1 et que je lis encore A je passe à l’état 2 sinon je retourne à l’état 0. 4. si j’atteins l’état 2 je reste dessus. L’état 2 est l’unique état final. Cet automate reconnaît n’importe quel mot contenant deux fois consécutives la lettre A. a) quels mots permet de détecter l’automate de la figure 6 ? b) Trouvez l’expression régulière qui permet de détecter exactement tous les mots sur l’alphabet à 4 lettres {a, b, c, d}contenant le sous-mot "acab". c) Trouvez l’automate fini (à 5 états) qui permet de détecter exactement tous les mots sur l’alphabet à 4 lettres {a, b, c, d}contenant le sous-mot "acab". 8 A e0 A e1 B B e2 B e3 A Figure 6 – Exercice (l’alphabet est {A,B}) 8 8.1 Séance 8 - Fouille de données Rappels de syntaxe On peut ouvrir un fichier avec la fonction open(), en lire le contenu avec la méthode read(), écrire avec write() et fermer avec close(). Dans la librairie os, la fonction getcwd() récupère le répertoire courant. 8.2 Exercices notés Exercice 26 Proposez une fonction extraction(adr) qui à partir d’une adresse adr récupère le contenu d’un fichier dans une chaîne de caractères. Exercice 27 Proposez une fonction getdots(adr) qui à partir d’un fichier de coordonnées contenant du texte sous format "(1,3) ;(-2,0) ;(6,-5). . . " remplit une liste de couples. Exercice 28 Proposez une fonction plot(adr) qui à partir d’un fichier de coordonnées contenant du texte sous format "(1,3) ;(-2,0) ;(6,-5). . . " trace les points correspondants. Exercice 29 Proposez une fonction write(s,adr) qui enregistre le contenu de la chaine s dans un fichier situé à l’adresse adr Exercice 30 Proposez une fonction merge(adr1,adr2,adr3) qui crée un fichier à l’adresse adr3 concaténant le contenu des fichiers d’adresses adr1 et adr2 puis supprime ces deux fichiers. 8.3 Exercices libres Problème 10 (Localisation) a) Créez deux fichiers french.txt et english.txt contenant chacun une dizaine de mots courants du langage concerné. b) Proposez une fonction tolist(adr) qui à partir de l’adresse d’un fichier adr extrait le contenu et le stocke dans une liste de mots. c) Proposez une fonction score(s,adr) qui détermine le nombre de mots de la chaine de caractères s présents dans le fichier situé à l’adresse adr. d) Proposez une fonction loc(adr2) qui détermine le langage le plus probable d’un texte stocké à l’adresse adr2. e) Proposez un programme checkspelling(adr2) qui liste les mots d’un texte stocké à l’adresse adr2 qui n’appartiennent pas au langage reconnu. 9 f ) Proposez un programme suggestions(adr2) qui suggère s’il existe des termes dans le texte stocké à l’adr2 qui ne diffèrent du dictionnaire du langage reconnu que par une ou deux lettres. Problème 11 (Versioning) a) Proposez une méthode check(adr,s) qui vérifie si le fichier à l’adresse adr contient la chaîne de caractère s. b) Proposez une méthode parse(rep,s) qui liste les fichiers d’un répertoire à l’adresse rep contenant la chaîne de caractère s. c) Proposez une méthode checkdiff(rep1,rep2) qui renvoie la liste des fichiers des répertoires rep1 et rep2 qui portent le même nom mais dont le contenu est différent. d) Proposez une méthode applychange(repdiff,rep2) qui remplace les fichiers de rep2 ayant le même nom que ceux de repdiff et laisse inchangés les autres fichiers de rep2. e) Proposez une méthode version(rep,reparchive) qui : — récupère dans le répertoire reparchive le sous-répertoire de numéro le plus élevé (appelons-le i, auquel cas son adresse est reparchive/i) — construit la différence entre rep et reparchive/i — stocke cette différence dans un nouveau répertoire à l’adresse reparchive/i+1. 9 Séance 9 - Rappels 10 Séance 10 - Introduction aux Bases de Données NB : Cette séance s’effectue intégralement avec un SGBD via une interface graphique et/ou console, au choix du/de la chargé-e de TD. Les fonctions python permettant d’interagir avec ces systèmes seront introduites à la séance suivante. 10.1 Rappels de syntaxe Exemples de commandes SQL : CREATE TABLE "Pokemon" ( "ID" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "nom" varchar(100) NOT NULL, "dresseur" varchar(100), "type" varchar(100), "age" integer) ; INSERT INTO Pokemon (ID, nom, dresseur, type, age) VALUES(”, ’Pikachu’,’Yasmine’, ’Feu’, 5) ; SELECT * FROM Pokemon WHERE dresseur=’Julie’ OR age < 15 ; 10 UPDATE Pokemon SET dresseur = ’Julie’ WHERE dresseur =’Yasmine’ AND type=’Glace’ ; 10.2 Exercices notés Exercice 31 Créez une base de données pokemon contenant deux tables appelées respectivement bestioles et dresseurs. La première possède les champs id, nom et type. La seconde possède les champs id, nom et age. Exercice 32 Utilisez des requêtes INSERT pour ajouter une dizaine de lignes de votre choix dans chacune des tables. Exercice 33 Utilisez une requête SELECT pour afficher toutes les bestioles de type ’Feu’. Exercice 34 Ajoutez dans cette base une table appelée collaboration possédant les champs id, id_dresseur et id_bestiole. Remplissez-la. Exercice 35 Utilisez une requête SELECT pour afficher toutes les bestioles ayant collaboré avec un dresseur d’âge 12 ans ou moins. 10.3 Exercices libres Problème 12 a) Modélisez puis implémentez une table de données permettant de lister des salles informatiques, avec leur parc d’ordinateurs et leurs horaires d’ouverture. b) Modélisez puis implémentez une table de données permettant de lister des cours avec des horaires et un nombre d’élèves. Cette table contiendra un champ salle_attribuee, pour le moment vide. c) Proposez une requête permettant de trouver la liste des salles dans laquelle un cours est possible (horaires compatibles et un ordinateur par élève) d) Proposez une série de requêtes permettant d’attribuer une salle à un cours (celle qui est compatible mais contient le moins d’ordinateur en trop possible) et de mettre à jour les disponibilités de la salle en conséquence. Problème 13 Proposez (et testez) des requêtes ou séries de requêtes permettant d’effectuer les filtres suivants (les formulations sont similaires mais les solutions peuvent être très différentes les unes des autres) : a) toutes les personnes dont le nom contient ACAB, b) toutes les personnes dont le nom contient ACAB et BAC, c) toutes les personnes dont le nom contient ACAB puis BAC, d) toutes les personnes dont le nom contient ACAB mais pas BAC, e) toutes les personnes dont le nom contient ACAB mais pas BAC ensuite (il peut cependant apparaître avant). 11 11.1 Séance 11 - Bases de données avec Python Rappels de syntaxe La connexion s’effectue avec connect(). Il faut ensuite créer un cursor, et appeler sur lui des méthode execute() prenant en argument des requêtes. 11 11.2 Exercices notés Exercice 36 Proposez une fonction connect(adr,login,pwd,base) qui tente de se connecter à une base de données à partir des identifiants en argument et affiche TRUE si elle y parvient et FALSE en cas d’échec. Exercice 37 Utilisez la fonction précédente pour refaire en python les exercices 31 et 32 du TD précédent. Exercice 38 De façon similaire, faites exécuter via python la requête SELECT de l’exercice 33 puis provoquez un affichage console du résultat. Exercice 39 De même, mais au lieu de provoquer un affichage console, stockez le résultat dans un dictionnaire dont les clefs sont les ids et les valeurs des couples (nom,type). Exercice 40 Proposez une fonction qui permet d’afficher tous les pokemon dont le type n’est pas Feu. 11.3 Exercices libres Problème 14 (Data Management) a) Créez un fichier xml contenant quelques lignes sur le modèle suivant : <individu><nom>Boris</nom><age>24</age></individu> <individu><nom>Gabrielle</nom><age>23</age></individu> ... b) Créez une fonction readvariables(adr) qui ouvre un fichier xml et renvoie la liste des champs de données. Dans l’exemple précédent, le résultat serait ("nom","age"). c) Créez une fonction readdata(adr) qui ouvre un fichier xml et renvoie la liste des données, chaque ligne elle-même sous forme de listes. Dans l’exemple précédent, le résultat serait ((Boris,24),(Gabrielle,23)). d) Créez une fonction xml2table(adrxml,adrhost,login,pwd,base) qui à partir d’un fichier xml crée une table dans une base de données reproduisant sa structure. e) Créez la fonction réciproque table2xml. f ) Proposez des fonctions jouant le rôle des requêtes INSERT et SELECT pour des fichiers xml, sans passer par des bases de données. Pensez à gérer les conditions WHERE et les jonctions entre les tables. Problème 15 (Memory) a) Créez une base de données qui modélise un jeu de memory, c’est-à-dire une liste de 8 paires de 2 cartes identiques et un plateau de 4×4 cases identifiées par leurs coordonnées et l’id de la carte qu’elle contienne. b) Proposez une fonction setup() qui initialise la position des cartes, fixe une variable score à 100, et crée une liste vide dejatrouvees. c) Proposez une fonction draw(i,j) qui permet de renvoyer le nom de la carte de coordonnées (x=i,y=j). d) Proposez une fonction play(i,j,k,l) qui révèle deux cartes et : — affiche leur valeur 12 — si elles sont différentes, diminue score de 1. — si elles sont identiques et ne figurent pas dans dejatrouvee, les ajoutent à dejatrouvee — si la taille de dejatrouvee atteint 16, termine la partie et affiche le score. e) Créez un jeu de memory en python. 12 Séance 12 - Interro Examen de contrôle continu, à la charge du/de la chargé-e de TD. 13