MP1 2015 - 2016 Lycée Janson de Sailly DS n°1 d’informatique pour tous
IPT - DS n°1
Vendredi 8 janvier 2016. Durée : 2h
1 Analyse de données
1. Donner la valeur des expressions Python suivantes :
a) [1, 2, 3] + [4, 5, 6]
b) 2 * [1, 2, 3]
Étant données deux listes d’entiers LA= [ap, ap1, ..., a0]et
LB= [bp, bp1, ..., 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 :
L= [ap+bp, ap1+bp1, ..., a0+b0]
2. Écrire une fonction Python somme(LA, LB) qui prend en pa-
ramètre deux listes de nombres de même longueur et qui ren-
voie 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.
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 00011010ben base 10. Convertir 5410 en base 2.
5. Donner en base 10 la valeur de 11100110bconsidéré comme en-
tier négatif codé sur un octet en machine.
On se propose d’écrire une fonction qui associe à tout entier
naturel nNsa représentation binaire, notée B(n).B(n)sera
représentée comme liste Python dont les éléments sont soit 0,
soit 1. En convenant que kN, bk∈ {0,1}, nous avons :
B(n)=[bp, bp1, ..., b0]n=p
X
k=0
bk2k
6. Écrire une fonction expo(n) qui prend pour argument un entier
naturel n>1et qui renvoie l’unique entier naturel p>0tel
que 2p6n < 2p+1.
7. Montrer que si 2p6n < 2p+1, alors 06(n2p)<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].
Considérons la fonction écrite ci-dessous :
def augmente(L, N) :
1""" L est une liste """
2longueur = len(L)
3if N > longueur :
4nombre = N - longueur
5prefixe = [ 0 for i in range(nombre) ]
6return prefixe + L
7else return L
Indiquer précisément ce réalise chaque ligne du code source
de cette fonction.
9. En observant que n= 2p+(n2p)montrer que la liste B(n)est
la somme (au sens de la question 2) des listes B(2p)et Bp(n2p).
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>0et qui renvoie la liste B(n)qui repré-
sente nen 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 * Programmation
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 :
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.
Exemple : mesure d’une tension sur 5 échantillons. Chaine de carac-
tères reçus : "U005+012+004-023-002+0420083"
Écrire en langage Python une fonction lect_mesures à un para-
mè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 ca-
ractère (’U’, ’I’ ou ’P’), une liste contenant l’ensemble des valeurs des
mesures reçues, enfin le checksum sous forme numérique.
Exemple : lect_mesures("U005+012+004-023-002+0420083") ren-
voie [’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 Py-
thon liste composé de deux éléments :
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.
Exemple de pile contenant 3 éléments, le sommet de la pile ayant
la valeur 2 : [ 3, [0, 1, 2] ].
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 pest vide et
renvoie True ou False.
3. Écrire la fonction empiler(p, e) qui empile l’élément eau som-
met 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.
2
MP1 2015 - 2016 Lycée Janson de Sailly DS n°1 d’informatique pour tous
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)
a) Démontrer la terminaison de cette fonction récursive.
b) Expliquer le rôle de cette fonction. Que renvoie l’appel ci-
dessous?
mystere( [15, [24, 45, 2, 3, 2, 6, 8, 9, 9, 10, 9, 3, 6, 7, 8]])
4 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 initia-
lement, est de compléter la grille en respectant quelques contraintes
simples :
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.
Aucun chiffre ne peut être répété sur la même colonne.
Python Algorithmique
3 4 1 8 7
9 5 6
4 7 9 5 3
7 3 2 4
7 8 2 4
6 2 8 3 5
5 1 3
1 3 2 4 9 6
n=35casessontrempliesinitialementdanscettegrille.
On représentera dans ce problème une grille de Sudoku par une liste de listes, chaque élément de la liste
principale représentant une ligne de la grille. L’absence dechire dans une ligne sera indiquée par un zéro.
Ainsi, la grille précédente se met sous la forme :
G=[[3,0,0,4,1,0,0,8,7],
[0,0,9,0,0,5,0,6,0],
....... ,
[1,3,0,0,2,4,0,9,6]]
On souhaite écrire un programme qui complète automatiquement la grille de Sudoku. L’algorithme
proposé utilise la technique du backtracking (ou retour sur trace). Elle consiste à revenir légèrement en
arrière sur des décisions prises afin de sortir d’un blocage. Elle correspond à peu près à la technique manuelle
qui consiste lorsqu’il y a plusieurs possibilités (Sudoku non trivial), à essayer un premier chire , puis tenter
de compléter la grille; si cela devient impossible, on gomme le premier chire, on le remplace par un autre
possible, puis on recommence ...
L’algorithme va nous permettre d’eectuer cette méthode d’essais et erreurs automatiquement.
1. On imagine résoudre le Sudoku par une méthode de « force brute », c’est-à-dire que l’on écrit toutes
les possibilités de remplissage sans contraintes, puis on cherche la bonne en testant si les contraintes
sont vérifiées. Quelle serait la complexité temporelle dans le pire des cas d’une telle méthode si ncases
sont initialement remplies? Vous semble-t-elle applicable?
2. Fonctions de test de contraintes
On cherche à vérifier si une valeur kest présente ou absente de la ligne, colonne, ou sous-grille 3×3.
Les cellules sont numérotées [i, j], avec i, j [0,8].
(a) Écrire une fonction absent_ligne(k, G, i) qui renvoie True si le chire kest absent dans la
i-ème ligne de la grille G,ouFalse sinon.
De même, écrire une fonction absent_colonne(k, G, j) qui renvoie True si le chire kest
absent dans la j-ème colonne de la grille G,ouFalse sinon.
(b) Écrire une fonction absent_bloc(k, G, i, j) qui renvoie True ou False suivant que le chire
kest absent dans le bloc qui contient la cellule [i, j].
3. Fonctions de position
Il sera utile pour la fonction principale de pouvoir passer delécritureproposéedeGàuncriture
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]
ou réciproquement.
(a) Expliquer le fonctionnement de la fonction récursive suivante :
def aplatir(i, j):
if i== 0 and j== 0:
return 0
if j>0:
Lycée Chaptal MP IPT,O. Arnoult Novembre 2015 Page 3/4
Voici un exemple de grille initiale
sur la figure suivante :
On représentera dans ce problème
une grille de Sudoku par une liste
de listes, chaque élément de la liste
principale représentant une ligne de
la grille. L’absence de chiffre dans
une ligne sera indiquée par un zéro.
Ainsi, la grille ci-contre se met sous
la forme :
G = [ [3, 0, 0, 4, 1, 0, 0, 8, 7], [0, 0, 9, 0, 0, 5, 0, 6, 0], ....... , [1, 3, 0,
0, 2, 4, 0, 9, 6] ]
On souhaite écrire un programme qui complète automatiquement
la grille de Sudoku. L’algorithme proposé utilise la technique du
backtracking (ou retour sur trace). Elle consiste à revenir légèrement
en arrière sur des décisions prises afin de sortir d’un blocage. Elle
correspond à peu près à la technique manuelle qui consiste lorsqu’il
y a plusieurs possibilités (Sudoku non trivial), à essayer un premier
chiffre , puis tenter de compléter la grille; si cela devient impossible,
on gomme le premier chiffre, on le remplace par un autre possible,
puis on recommence ...
L’algorithme va nous permettre d’effectuer cette méthode d’essais
et erreurs automatiquement.
1. Fonctions de test de contraintes. On cherche à vérifier si une
valeur kest présente ou absente de la ligne, colonne, ou sous-
grille 3 ×3. Les cellules sont numérotées [i, j], avec (i, j)
[[0,8]] ×[[0,8]].
3
MP1 2015 - 2016 Lycée Janson de Sailly DS n°1 d’informatique pour tous
a) Écrire une fonction absent_ligne(k, G, i) qui renvoie
True si le chiffre kest 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 kest absent dans la jème
colonne de la grille G, ou False sinon.
c) Écrire une fonction absent_bloc(k, G, i, j) qui renvoie
True ou False suivant que le chiffre kest 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
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) :
nest la position courante dans GU, correspondant à G[i][j]
dans G.
La fonction teste si G[i][j] est non nul. Si oui, elle ap-
pelle completer(G, n+1). Si non elle tente de donner une
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.
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 kin range(1, 10) :
# Essai d’affectation de valeur et backtracking
G[i][j] = 0
return False
a) Écrire les instructions de terminaison de la fonction récur-
sive.
b) À l’aide de la fonction completer, compléter le cas où la
cellule courante numéro nest déjà remplie.
c) Compléter la partie « backtracking » : la fonction doit af-
fecter 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 ?
Le remplissage complet d’une grille est réalisé en appelant
completer(G, 0).
4
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !