1 Analyse de données

publicité
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
Téléchargement