Oraux Blancs Python

publicité
Oraux Blancs Python
Classe de PT
Lycée La Prat’s
Planche 1 (2015, ENSAM python — élève 1)
1) Coder une fonction qui détermine si un nombre est premier.
2) Écrire une fonction listePremiers(n) qui retourne la liste des nombres premiers inférieurs à un entier
n. Quelle est sa complexité ?
3) Écrire une fonction listePremiersBis(n) qui retourne une liste identique à la précédente, mais en
« rayant » les nombres qui ne sont pas premier, en commençant par les multiples de 2, de 3, etc. Quelle
est sa complexité ?
4) Illustrer les complexités à l’aide d’un compteur.
Planche 2 (2015, ENSAM Python — élève 2)
Soit A(22, 10), B(12, 3) et C(3, 3). On pourra utiliser la fonction randint de la bibliothèque numpy.random.
1) Tracer le triangle ABC à l’aide de la fonction plot.
2) On définit la suite (Tn ) de points par : T0 = A, B ou C de façon équiprobable, et si Tn est construit,
Tn+1 est le milieu entre Tn et l’un des trois points A, B ou C de façon équiprobable.
Écrire une fonction d’argument un point T et qui renvoie le milieu S entre T et l’un des trois points
A, B ou C.
3) Créer un tableau numpy M de taille 11 × 2 contenant les 11 premiers points de (T n). Afficher M en
nuage de points.
4) Faire de même avec 10 000 points.
5) Afficher plusieurs tirages de couleurs différentes.
Planche 3 (2015, ENSAM Python — conj.)
Nombres parfaits.
1) Écrire une fonction qui donne l’ensemble des diviseurs stricts (autres que lui-même) d’un nombre n.
2) On appelle nombre parfait un entier naturel qui est la somme de ses diviseurs stricts. Déterminer les
nombres parfaits inférieurs à 10000.
3) Déterminer les nombres parfaits trouvés à la question précédente qui s’écrivent comme somme de
nombres impairs consécutifs élevés au cube.
4) Déterminer la somme des inverses des diviseurs d’un nombre parfait.
Planche 4 (2015, ENSAM Python — Mimard)
Soit E = {a1 , . . . , an } un ensemble. Si Ai représente une partie de E, elle est représentée par le code ci tel
que ci [k] = 0 si ak ∈ Ai , et 1 sinon.
1) Écrire une fonction reunion d’arguments c1 et c2 qui retourne le code de A1 ∪ A2 .
2) Écrire une fonction estRec d’argument L une liste de codes associés à des sous-ensembles de E et
retournant True si la réunion de ces sous-ensemble vaut E et False sinon.
3) Soit R un ensemble de parties de E représenté par une liste L de codes. On dit que R est un recouvrement minimal de E si la réunion des parties de R vaut E et que pour tout R0 inclus dans R et
différent de R, R0 n’est pas un recouvrement de E (la réunion des parties de R est différente de E).
Écrire la fonction estRecMin d’argument L une liste de codes représentant R, qui retourne True si R
est un recouvrement minimal de E et False sinon.
1
Lycée La Prat’s
Oraux Blancs Python
Planche 5 (2015, ENSAM Python — Mimard)
On dit qu’un mot est un palindrome si il est le même lorsqu’on le lit à l’envers. Par exemple le mot "radar"
est un palindrome. Le mot "nul" donne "lun" à l’envers et n’est pas un palindrome.
1) Écrire une fonction inverse d’argument une chaîne de caractères mot et renvoyant la chaîne écrite à
l’envers.
2) Écrire une fonction palindrome d’argument une chaine de caractères mot et qui renvoie le booléen
True si le mot est est un palindrome et False sinon.
3) Par extension on dit qu’un nombre est un palindrome si il est égal au nombre obtenu en écrivant les
chiffres en ordre inverse.
Écrire une fonction palNombre, d’argument N et renvoyant la liste des nombres palindromes inférieur
ou égaux à N .
Exercice 1 (Décomposition en base 2)
1) Écrire une fonction récursive dec2bin de paramètre n entier qui renvoie la chaîne de caractère constitué
des chiffres de n en base 2.
2) Écrire une fonction récursive bin2dec de paramètre s chaîne de caractère qui renvoie l’entier représenté
en base 2 par s.
3) Écrire deux fonctions analogues aux précédente mais prenant en paramètre la base b.
Exercice 2 (Tri fusion)
1) Écrire une fonction qui fusionne deux listes déjà triées.
2) Écrire un algorithme de tri fusion, qui fait appel à la fonction précédente. On peut écrire un algorithme
récursif ou non récursif, au choix.
3) Faire afficher le contenu des variables à chaque étape.
4) Étudier la complexité en temps et en mémoire lorsque la longueur de la liste est une puissance de 2.
Exercice 3 (Autour du démineur)
On pourra utiliser la fonction rand de la sous-bibliothèque numpy.random. Chaque fonction doit être testée.
Dans tout ce TP, on appellera « grille » un tableau en Python (liste de listes ayant toutes la même longueur
ou tableau NumPy) constitué uniquement de 0 et de 1.
1) Écrire une commande Python permettant de créer rapidement une grille à n lignes et p colonnes ne
contenant que des zéros.
2) Écrire une fonction Python qui prend comme argument une grille g et qui ressort la proportion de 0
dans la grille.
3) Écrire une fonction Python qui prend comme arguments trois entiers n, p et k et qui créée une grille
à n lignes et p colonnes avant d’y insérer k nombres 1 à des emplacements aléatoires, le reste étant
constitué de zéros.
4) Écrire une fonction Python prenant comme argument une grille et deux entiers i et j, et qui compte le
nombre de voisins de la case (i, j) (située sur la ligne i et la colonne j) contenant des 1 (les voisins sont
toutes les cases adjacentes à la case (i, j), y compris en diagonale, ce qui fait un maximum possible de
huit voisins pour une case qui n’est pas sur un côté de la grille).
On pourra distinguer des cas pour les coins et les cases en bord de grille.
5) En déduire une fonction Python qui transforme une grille en un tableau de même taille contenant le
caractère M partout où la grille avait des 1, et le nombre de voisins contenant des mines (des 1 dans
la grille initiale) sur les cases qui contenaient des 0.
6) Programmer un démineur.
Exercice 4 (Simulation de variables aléatoires)
On pourra utiliser la fonction rand de la sous-bibliothèque numpy.random. Chaque fonction doit être testée.
1) Écrire une fonction Xb d’argument p ∈]0, 1[ retournant 1 avec probabilité p et 0 avec probabilité 1 − p.
2
Oraux Blancs Python
Lycée La Prat’s
2) Écrire une fonction echantillon d’argument N et p effectuant N tirages de la variable aléatoire
précédente et retournant la proportion de x obtenus pour tout x ∈ X(Ω). Que constate-t-on lorsque
N grandit ?
3) Avec p = 1/2 et des suites de n = 20 tirages, quel est statistiquement (avec N = 1000 essais) la
probabilité d’avoir une suite de 1 de longueur 6 ?
4) Écrire une fonction premiere_apparition d’argument p qui retourne le temps de première apparition
d’un 1 lors de tirage successifs de la variable aléatoire précédente.
5) Écrire une fonction lgt_premiere_chaine d’argument p qui retourne la longueur de la première
chaîne.
6) Tester statistiquement l’affirmation suivante : « Lors d’une suite de lancers indépendants avec une
pièce non équilibrée (probabilité p ∈]0, 1[ d’avoir pile), la longueur X de la première chaîne, n’est pas
indépendante de la longueur Y de la deuxième chaîne. »
Exercice 5 (Attracteur étrange)
Dans le modèle météorologique de Lorenz (à l’origine de la découverte du fameux effet papillon), trois
fonctions temporelles vérifient le système d’équations différentielles suivant :
 0

x


= 10(y − x)
y 0 = 28x − y − xz

8

 z 0 = xy − z
3
où x, y et z dépendent du temps t. On prendra comme conditions initiales x(0) = y(0) = z(0) = 1.
On importera la sous-bibliothèque matplotlib.pyplot sous l’abréviation plt.
dY
1) Écrire une fonction F tel que le système précédent s’écrive
= F (Y, t).
dt
2) À l’aide de la fonction odeint de la bibliothèque scipy.integrate, effectuer une résolution approchée
du système précédent. On prendra comme intervalle de temps pour la résolution l’intervalle [0, 50], et
n = 1000.
3) Représenter graphiquement sur une même figure les trois courbes de x, y et z.
4) Recommencer en modifiant légèrement la valeur initiale de z (en prenant par exemple z(0) = 1.001).
Commenter les résultats obtenus.
5) On souhaite maintenant représenter dans l’espace les variables x, y et z. Pour cela, effectuer l’importation suivante :
from mpl_toolkits.mplot3d import Axes3D
Pour tracer votre courbe dans l’espace, vous taperez ensuite les deux lignes de code suivantes :
plt.gca(projection=’3d’)
plt.plot(x,y,z)
6) Tracez une courbe 3D pour le problème posé, et modifiez les conditions initiales pour voir si cela
change l’allure de la courbe. Commentez les résultats obtenus.
7) Écrire un programme appliquant la méthode d’Euler à ce système d’équations, comparer avec les
solutions données par odeint.
Exercice 6 (images)
On utilisera les bibliothèques numpy et matplotlib.pyplot (fonctions imshow et imread ).
Le but est de transformer une image couleur en une image en niveaux de gris, et de modifier le contraste.
1) Ouvrir l’image image.png du répertoire courant. L’afficher. Décrire le type de l’objet contenant l’image.
2) Afficher l’image contenant uniquement le (on pourra utiliser l’option cmap = ’gray’).
3) Écrire une fonction passant « naïvement » l’image en niveau de gris.
4) L’être humain ne perçoit pas les couleurs avec la même intensité. Le vert semble plus lumineux que le
rouge qui est lui même plus lumineux que le bleu. Proposer une amélioration de la fonction précédente.
(rouge : 0.21 ; vert : 0.72 ; bleu : 0.07).
Lycée La Prat’s
Oraux Blancs Python
5) Écrire une fonction histogramme(im) qui renvoie un triplet de listes (h_r, h_g, h_b) de longueur
256 telle que h_r[i] soit égal au nombre de pixels de l’image dont la valeur « rouge » vaut i (de même
pour h_g et le vert...).
6) Écrire une fonction affiche_histo(h) qui prenne un triplet tel que celui produit par la fonction
précédente et affiche la quantité de pixel en fonction de l’intensité.
4
Téléchargement