MP1 2015 - 2016 Lycée Janson de Sailly DS n°1 d’informatique pour tous représentée comme liste Python dont les éléments sont soit 0, soit 1. En convenant que ∀ k ∈ N, bk ∈ {0, 1}, nous avons : IPT - DS n°1 Vendredi 8 janvier 2016. Durée : 2h 1 B(n) = [bp , bp−1 , ..., b0 ] ⇐⇒ n = Analyse de données 1. Donner la valeur des expressions Python suivantes : a) [1, 2, 3] + [4, 5, 6] b) 2 * [1, 2, 3] p X bk 2k k=0 6. Écrire une fonction expo(n) qui prend pour argument un entier naturel n > 1 et qui renvoie l’unique entier naturel p > 0 tel que 2p 6 n < 2p+1 . Étant données deux listes d’entiers LA = [ap , ap−1 , ..., a0 ] et LB = [bp , bp−1 , ..., b0 ] ayant le même nombre d’éléments, nous définirons la somme de ces deux listes comme l’unique liste L s’écrivant : 7. Montrer que si 2p 6 n < 2p+1 , alors 0 6 (n − 2p ) < 2p . 8. Notons | B(n) | le nombre d’éléments de la liste B(n). Pour tout entier N > | B(n) | nous noterons BN (n) la liste de N éléments construite à partir de B(n) en la complétant à gauche par des zéros. Exemple : si B(n) = [1, 0, 1] alors B6 (n)(n) = [0, 0, 0, 1, 0, 1]. L = [ap + bp , ap−1 + bp−1 , ..., a0 + b0 ] 2. Écrire une fonction Python somme(LA, LB) qui prend en paramètre deux listes de nombres de même longueur et qui renvoie une nouvelle liste que est la somme de ces deux listes. Par exemple : somme( [1, 2, 3], [4, 5, 6] ) renvoie [5, 7, 9]. Aucune vérification ne sera faite sur l’égalité de la longueur des deux listes. Considérons la fonction écrite ci-dessous : def 1 2 3 4 5 6 7 3. Écrire de même une fonction Python mul à deux paramètres, un nombre et une liste de nombres, qui multiplie chaque élément de la liste par le nombre et renvoie une nouvelle liste. Exemple : mul( 2, [1, 2, 3] ) renvoie [2, 4, 6] 4. Convertir 00011010b en base 10. Convertir 5410 en base 2. 5. Donner en base 10 la valeur de 11100110b considéré comme entier négatif codé sur un octet en machine. augmente(L, N) : """ L est une liste """ longueur = len(L) if N > longueur : nombre = N - longueur prefixe = [ 0 for i in range(nombre) ] return prefixe + L else return L Indiquer précisément ce réalise chaque ligne du code source de cette fonction. On se propose d’écrire une fonction qui associe à tout entier naturel n ∈ N sa représentation binaire, notée B(n). B(n) sera 9. En observant que n = 2p + (n − 2p ) montrer que la liste B(n) est la somme (au sens de la question 2) des listes B(2p ) et Bp (n−2p ). 1 MP1 2015 - 2016 Lycée Janson de Sailly DS n°1 d’informatique pour tous 10. Écrire une fonction récursive d2b(n) qui prend en argument un entier naturel n > 0 et qui renvoie la liste B(n) qui représente n en base 2. Pour cela, vous vous appuierez entièrement sur l’étude précédente et vous utiliserez les trois fonctions vues précédemment, à savoir : expo, somme et augmente. 2 Exemple : lect_mesures("U005+012+004-023-002+0420083") renvoie [’U’,[12,4,-23,-2, 42], 83] 3 Piles et récursivité On décrira dans cet exercice une pile sous la forme d’un objet Python liste composé de deux éléments : * Programmation • Le nombre d’éléments de la pile, représenté par un entier. • Le contenu de la pile, représenté par une liste où le premier élément est le fond de la pile et le dernier élément est le sommet de la pile. Une liaison série asynchrone permet la communication entre la carte de commande/acquisition et un PC. Les échantillons correspondant à une mesure sont envoyés par la carte électronique sous la forme d’une trame (suite de caractères ASCII). Cette suite de caractères se présente sous la forme suivante : Exemple de pile contenant 3 éléments, le sommet de la pile ayant la valeur 2 : [ 3, [0, 1, 2] ]. • un entête qui permet d’identifier la mesure sur un caractère (’U’ tension moteur, ’I’ courant moteur, ’P’ position absolue) ; • le nombre de données envoyées (codé sur 3 caractères qui sont des chiffres) ; • les données constituées des mesures brutes codées à l’aide du caractère ’+’ ou ’-’ suivi de 3 caractères pour la valeur absolue ; • un checksum, somme des valeurs absolues des données précédentes modulo 10000 sur 4 caractères. Le nombre de données transmises n’est pas inclus dans le checksum. Les listes Python étant redimensionnables, la pile sera supposée de capacité illimitée (si ce n’est par la mémoire de la machine). Fonctions élémentaires On ne pourra pas utiliser les méthodes append ou pop sur les listes dans cette partie, mais uniquement la concaténation pour modifier la taille d’une liste. 1. Écrire la fonction creer_pile(), qui renvoie une pile vide. 2. Écrire la fonction est_vide(p), qui teste si la pile p est vide et renvoie True ou False. 3. Écrire la fonction empiler(p, e) qui empile l’élément e au sommet de la pile p. 4. Écrire la fonction depiler(p) qui retire l’élément au sommet de la pile et renvoie sa valeur, dans le cas où cela est possible. Dans le cas contraire, un message d’erreur sera affiché par la fonction. Exemple : mesure d’une tension sur 5 échantillons. Chaine de caractères reçus : "U005+012+004-023-002+0420083" Écrire en langage Python une fonction lect_mesures à un paramètre de type chaîne de caractères de la forme définie ci-dessus, qui retourne une liste contenant : le type de la mesure codé sur un caractère (’U’, ’I’ ou ’P’), une liste contenant l’ensemble des valeurs des mesures reçues, enfin le checksum sous forme numérique. 2 MP1 2015 - 2016 Lycée Janson de Sailly DS n°1 d’informatique pour tous — Aucun chiffre ne peut être répété dans chaque sous-grille 3 × 3. — Aucun chiffre ne peut être répété sur la même ligne. Python — Aucun chiffre ne peut être répété sur la même colonne. Analyse d’une fonction mystere. Considérons la fonction ci-dessous : def mystere(p) : """p est une pile""" if p[0] == 0 : return "Pile Vide" elif p[0] == 1 : return depiler(p) else : a = depiler(p) b = depiler(p) if a < b : empiler(p, a) else : empiler(p, b) return mystere(p) Voici un exemple de grille initiale 3 4 1 8 7 sur la figure suivante : 9 5 6 4 7 9 5 3 On représentera dans ce problème 7 3 2 4 une grille de Sudoku par une liste de listes, chaque élément de la liste 7 8 2 4 principale représentant une ligne de 6 2 8 3 5 la grille. L’absence de chiffre dans 5 1 3 1 3 2 4 9 6 une ligne sera indiquée par un zéro. Ainsi, la grille ci-contre se metnsous = 35 cases sont remplies initialement dans cette grille. la forme : On représentera dans ce problème une grille de Sudoku par une liste de listes, chaque él principale de chiffre 0, 0, 4, 1, représentant 0, 0, 8, 7], une [0, ligne 0, 9,de0,la0,grille. 5, 0,L’absence 6, 0], ....... , [1, dans 3, 0,une ligne sera indiq Ainsi, la grille précédente se met sous la forme : G = [ [3, 0, 2, 4, 0, 9, 6] ] G = [ a) Démontrer la terminaison de cette fonction récursive. b) Expliquer le rôle de cette fonction. Que renvoie l’appel cidessous ? mystere( [15, [24, 45, 2, 3, 2, 6, 8, 9, 9, 10, 9, 3, 6, 7, 8]]) 4 [3, 0, 0, 4, 1, 0, 0, 8, 7], On souhaite écrire un programme automatiquement 0, complète 5, 0, 6, 0], [0, 0, 9, 0,qui ....... , la grille de Sudoku. L’algorithme proposé utilise la technique du 3, 0, 0, 2, 4, 0, 9, 6] ] [1, backtracking (ou retour sur trace). Elle consiste à revenir légèrement en arrière surOn dessouhaite décisions afin de qui sortir d’unautomatiquement blocage. Elle la grille de Sudok écrireprises un programme complète correspond proposé à peu utilise près àla latechnique technique manuelle qui consiste du backtracking (ou retour sur lorsqu’il trace). Elle consiste à reveni arrière sur des décisions prisesnon afin de sortir d’un blocage. Elle y a plusieurs possibilités (Sudoku trivial), à essayer un correspond premier à peu près à la tec quitenter consistede lorsqu’il y a plusieurs possibilités nonimpossible, trivial), à essayer un premier ch chiffre , puis compléter la grille ; si cela(Sudoku devient de compléter la grille ; si cela devient impossible, on gomme le premier chiffre, on le rempl on gomme possible, le premier chiffre, on le remplace par un autre possible, puis on recommence . . . puis on recommence ... L’algorithme va nous permettre d’effectuer cette méthode d’essais et erreurs automatiq L’algorithme va imagine nous permettre cette méthode d’essais 1. On résoudre le d’effectuer Sudoku par une méthode de « force brute », c’est-à-dire que et erreurs automatiquement. les possibilités de remplissage sans contraintes, puis on cherche la bonne en testant s Le jeu du Sudoku Un Sudoku n’est pas tant un jeu axé sur les nombres mais un puzzle de placement de symboles, même si les Sudokus communément utilisés font usage des nombres arabes de 1 à 9. Le but d’un Sudoku, sous la forme d’une grille 9 × 9, avec un numéro par cellule et un certain nombre de cellules remplies initialement, est de compléter la grille en respectant quelques contraintes simples : 1. 3 sont vérifiées. Quelle serait la complexité temporelle dans le pire des cas d’une telle m sont remplies ? Vous Fonctions de initialement test de contraintes. Onsemble-t-elle cherche àapplicable vérifier ?si une Fonctions de test contraintes valeur k2. est présente oudeabsente de la ligne, colonne, ou sousOn cherche à vérifier si une valeur k est présente ou absente de la ligne, colonne, ou s grille 3 × 3. Les cellules sont numérotées [i, j], avec (i, j) ∈ Les cellules sont numérotées [i, j], avec i, j ∈ [0, 8]. [[0, 8]] × [[0, 8]]. (a) Écrire une fonction absent_ligne(k, G, i) qui renvoie True si le chiffre k es i-ème ligne de la grille G, ou False sinon. De même, écrire une fonction absent_colonne(k, G, j) qui renvoie True si absent dans la j-ème colonne de la grille G, ou False sinon. (b) Écrire une fonction absent_bloc(k, G, i, j) qui renvoie True ou False suiva k est absent dans le bloc qui contient la cellule [i, j]. MP1 2015 - 2016 Lycée Janson de Sailly DS n°1 d’informatique pour tous valeur à G[i](j] parmi celles qui sont possibles et appelle completer(G, n+1). • En cas d’échec, elle retourne False. • Elle renvoie True si la grille est complète. a) Écrire une fonction absent_ligne(k, G, i) qui renvoie True si le chiffre k est absent dans la ième ligne de la grille G, ou False sinon. b) De même, écrire une fonction absent_colonne(k, G, j) qui renvoie True si le chiffre k est absent dans la j ème colonne de la grille G, ou False sinon. Elle se présente sous la forme suivante (où il faudra compléter les instructions manquantes) : def completer(G, n) : """n est la position courante dans la grille unidimensionnelle GU associée à G""" # Instructions de terminaison de la fonction récursive i, j = position(n) if G[i](j] != 0 : # Instructions si la cellule courante est déjà remplie else : for k in range(1, 10) : # Essai d’affectation de valeur et backtracking G[i][j] = 0 return False c) Écrire une fonction absent_bloc(k, G, i, j) qui renvoie True ou False suivant que le chiffre k est absent dans le bloc qui contient la cellule [i, j]. 2. Fonctions de position. Il sera utile pour la fonction principale de pouvoir passer de l’écriture proposée de G à une écriture unidimensionnelle de la forme : GU = [3, 0, 0, 4, 1, 0, 0, 8, 7, 0, 0, 9, 0, 0, 5, 0, 6, 0,...0, 9, 6] a) Expliquer ce que renvoie la fonction suivante : def indexGU(i, j) : return 9*i+j a) Écrire les instructions de terminaison de la fonction récursive. b) À l’aide de la fonction completer, compléter le cas où la cellule courante numéro n est déjà remplie. c) Compléter la partie « backtracking » : la fonction doit affecter un chiffre compatible avec les contraintes et vérifier récursivement que la grille ainsi formée est correcte. d) À quoi sert la dernière étape G[i][j] = 0 ? b) Écrire une fonction position(n) qui renvoie les coordonnées (i, j) associées au nème élément de GU, sous la forme d’un 2-uplet. 3.* Fonction principale. La fonction principale est une fonction récursive appelée completer(G, n) : • n est la position courante dans GU, correspondant à G[i][j] dans G. • La fonction teste si G[i][j] est non nul. Si oui, elle appelle completer(G, n+1). Si non elle tente de donner une Le remplissage complet d’une grille est réalisé en appelant completer(G, 0). 4