Vous êtes sur la page 1sur 16

Groupe Nom Prénom

Devoir sur Table 2018 – 2019


Éléments de Programmation I – 1I001
Durée : 1h30
Documents autorisés: Aucun document ni machine électronique n’est autorisé à l’exception de
la carte de référence de Python.
Le sujet comporte 16 pages. Ne pas désagrafer les feuilles.
Répondre directement sur le sujet, dans les boîtes appropriées. La taille des boîtes suggère le
nombre de lignes de la réponse attendue. Le quadrillage permet d’aligner les indentations.
Le barème indiqué pour chaque question n’est donné qu’à titre indicatif. Le barème total est lui
aussi donné à titre indicatif : 47 points auxquels peuvent s’ajouter des points bonus explicités dans
l’énoncé des questions.
La clarté des réponses et la présentation des programmes seront appréciées. Les exercices peuvent
être résolus dans un ordre quelconque. Pour répondre à une question, il est possible, mais pas
nécessairement utile, d’utiliser les fonctions qui sont l’objet des questions précédentes,
même si vous n’avez répondu à ces questions précédentes.
Remarque: si nécessaire, on considère que la bibliothèque de fonctions mathématiques a été
importée avant les fonctions à écrire. Sauf mention contraire explicite, seules les primitives Python
présentes sur la carte de référence peuvent être utilisées.
Important: bien lire ce qui est demandé dans l’intitulé de la question. Sauf exception (ex.: fonction
mystère), pour les fonctions demandées, il est nécessaire de donner une définition avec
signature et hypothèse(s) éventuelle(s), mais pas nécessaire de donner la description ou un
jeu de test.
Notation des spécifications: Une spécification (signature et hypothèses) seule ne rapporte pas
de point. Une fonction correcte dont la spécification est fausse ou manquante est pénalisée.
L’examen est composé de quatre exercices indépendants :
— Manipulation de listes (p. 1)
— Analyse d’une fonction mystère (p. 5)
— Chaînes et stéganographie texte (p. 8)
— Nombre narcissique (p. 11)

Exercice 1 : Manipulation de listes


Question 1.1 : [3/47]
Donner une définition avec signature et hypothèse(s) éventuelle(s) de la fonction passe_bande
qui, étant donné une liste L de nombres et deux nombres mn et mx tels que mn est inférieur ou
égal à mx, retourne la liste composée des éléments de L qui sont compris entre mn et mx (les deux
inclus). Par exemple :
>>> passe_bande([], 2, 5)
[]
>>> passe_bande([1, 2, 3, 4, 5, 6], 7, 9)
[]
>>> passe_bande([2.2, 2.3, 2.0, 2.1, 2.0, 2.3], 2.0, 2.0)
[2.0, 2.0]


c Sorbonne Université - 1I001 - page 1 -
Groupe Nom Prénom

>>> passe_bande([2.9, 5.5, 3.2, 7.0, 10.1, 6.1, 11.1, 9.7], 3.0, 6.1)
[5.5, 3.2, 6.1]

Question 1.2 : [3/47]


Donner une définition avec signature et hypothèse(s) éventuelle(s) de la fonction cycle qui, étant
donné une liste L et un entier naturel n, retourne la liste obtenue en répétant n fois le contenu de
la liste L.
Par exemple :
>>> cycle([1, 2, 3], 0)
[]
>>> cycle([1, 2, 3], 1)
[1, 2, 3]

>>> cycle([1, 2, 3], 2)


[1, 2, 3, 1, 2, 3]
>>> cycle([1, 2, 3], 3)
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> cycle([’a’, ’b’], 1)
[’a’, ’b’]
>>> cycle([’a’, ’b’], 2)
[’a’, ’b’, ’a’, ’b’]
>>> cycle([’a’], 4)
[’a’, ’a’, ’a’, ’a’]


c Sorbonne Université - 1I001 - page 2 -
Groupe Nom Prénom

Question 1.3 : [4/47]


Donner une définition avec signature et hypothèse(s) éventuelle(s) de la fonction intercale qui,
étant donné une liste L et un élément séparateur s, retourne la liste obtenue en séparant les
éléments de L par s.
Par exemple :
>>> intercale([1, 2, 3], 42)
[1, 42, 2, 42, 3]
>>> intercale([1], 42)
[1]
>>> intercale([], 42)
[]
>>> intercale([’un’, ’deux’, ’trois’], ’et’)
[’un’, ’et’, ’deux’, ’et’, ’trois’]


c Sorbonne Université - 1I001 - page 3 -
Groupe Nom Prénom


c Sorbonne Université - 1I001 - page 4 -
Groupe Nom Prénom

Exercice 2 : Fonction mystère


Question 2.1 : [1/47]
Compléter dans les cadres prévus à cet effet les informations de typage et les hypothèses de la
fonction mystère ci-dessous, en supposant que son unique paramètre est une chaîne de caractères.
Attention : il n’est demandé ici que de compléter la signature de la fonction et donner les décla-
rations des types des variables.
def mystere(x):

""" ->
... """

# y :
y = 0

# z :
z = ’’

# w :
for w in x:
if z == ’’:
z = w
elif z == w:
z = ’’
else:
z = w
y = y + 1

if z == ’’:
return y
else:
return y + 1


c Sorbonne Université - 1I001 - page 5 -
Groupe Nom Prénom

Question 2.2 : [3/47]


Compléter la table de simulation de boucle ci-dessous correspondant à l’application mystere("aabccc").
En déduire la valeur retournée par la fonction (compléter la case en dessous de la table).
Remarque : la table ci-dessous comporte plus de lignes que nécessaire.

Tour Variable w Variable z Variable y

entrée

La valeur retournée par la fonction est :

Question 2.3 : [5/47]


Si la chaîne x de longueur non nulle ne contient que des ’a’, quelles sont les valeurs possibles
pour mystere(x) ? Donner quelques tests permettant d’illustrer votre réponse.


c Sorbonne Université - 1I001 - page 6 -
Groupe Nom Prénom

Si une chaîne x est de longueur 3, quelles sont les valeurs possibles pour mystere(x) ? Donner
quelques tests permettant d’illustrer votre réponse.

Décrire une chaîne x telle que mystere(x) vaille 1000.

Existe-t-il une chaîne x de longueur 2019 telle que mystere(x) vaille 0 ? vaille 1 ? Si oui, donner
la description de la chaîne.

Donner la description (en français) de la fonction et donner quelques tests supplémentaires per-
mettant d’illustrer son comportement (sans oublier les éventuels cas limites).


c Sorbonne Université - 1I001 - page 7 -
Groupe Nom Prénom

Exercice 3 : Chaînes et stéganographie texte


Les questions de cet exercice ont pour but de pouvoir trouver des phrases cachées dans des phrases
(stéganographie texte).
Dans tout l’exercice, on note :
— mot le type des chaînes de caractères sans espace et sans ponctuation autre que l’apos-
trophe. Par exemple, "l’exercice" et ’stéganographie’ sont de type mot, mais
’autre exemple’ et ’exemple.’ ne le sont pas.
— phrase le type des chaînes de caractères comportant au moins un élément de type mot et
se terminant par un point ’.’. Les mots sont séparés deux-à-deux par des espaces, il n’y a
pas d’autre signe de ponctuation que le point final. Par exemple :
’Je hais les voyages et les explorateurs.’ est une phrase et,
’Longtemps, je me suis couché de bonne heure.’ qui comporte une virgule n’en
est pas une.

Question 3.1 : [2/47]


Donner une définition avec signature et hypothèse(s) éventuelle(s) de la fonction ieme_ou_espace
qui, étant donné un mot m et un entier naturel non nul p, renvoie le p-ème caractère de la chaîne
s’il existe, le caractère espace ’ ’ sinon. Par exemple :
>>> ieme_ou_espace(’test’,1)
’t’
>>> ieme_ou_espace(’test’,2)
’e’
>>> ieme_ou_espace(’test’,5)
’ ’


c Sorbonne Université - 1I001 - page 8 -
Groupe Nom Prénom

Question 3.2 : [4/47]


Donner une définition avec signature et hypothèse(s) éventuelle(s) de la fonction gen_phrase
qui, étant donné une liste de mots L, renvoie la phrase constituée des mots de L.

Par exemple :
>>> gen_phrase([’Je’, ’hais’, ’les’, ’voyages’, ’et’, ’les’, ’explorateurs’])
’Je hais les voyages et les explorateurs.’
>>> gen_phrase([’Cette’, ’question’, ’est’, ’la’, ’deuxième’])
’Cette question est la deuxième.’
>>> gen_phrase(["J’aime", ’lire’])
"J’aime lire."
>>> gen_phrase(["D’accord"])
"D’accord."

Question 3.3 : [5/47]


Donner une définition avec signature et hypothèse(s) éventuelle(s) de la fonction decoupe_phrase
qui, étant donné une phrase s, renvoie la liste des mots de s.
Par exemple :
>>> decoupe_phrase(’Je hais les voyages et les explorateurs.’)
[’Je’, ’hais’, ’les’, ’voyages’, ’et’, ’les’, ’explorateurs’]
>>> decoupe_phrase(’Cette question est la troisième.’)
[’Cette’, ’question’, ’est’, ’la’, ’troisième’]
>>> decoupe_phrase("J’aime lire.")
["J’aime", ’lire’]


c Sorbonne Université - 1I001 - page 9 -
Groupe Nom Prénom

>>> decoupe_phrase("D’accord.")
["D’accord"]
>>> decoupe_phrase("Armelle admet avoir empoché sans broncher ddeux pieces.")
[’Armelle’, ’admet’, ’avoir’, ’empoché’, ’sans’, ’broncher’, ’ddeux’, ’pieces’]

Question 3.4 : [5/47]


Donner une définition avec signature et hypothèse(s) éventuelle(s) de la fonction sous_phrase
qui, étant donné une liste de mots L et un entier naturel non nul i, renvoie la phrase constituée
des ièmes lettres des mots de L si elle existent ou d’un espace sinon. On supposera que la liste L
ne contient pas deux mots consécutifs pour lesquels la ième lettre n’existe pas.


c Sorbonne Université - 1I001 - page 10 -
Groupe Nom Prénom

Par exemple :
>>> sous_phrase([’Ceci’, ’presage’, ’un’, ’mauvais’, ’exemple’], 1)
’Cpume.’
>>> sous_phrase([’Ceci’, ’est’, ’un’, ’autre’, ’mauvais’, ’test’], 3)
’ct tus.’
>>> sous_phrase([’xxjxx’, ’xxex’, ’xx’, ’xxrxx’, ’xxixx’, ’xxsxx’], 3)
’je ris.’
>>> sous_phrase([’Armelle’, ’admet’, ’avoir’, ’empoché’, ’sans’, ’broncher’, ’ddeux’, ’pieces’],2)
’rdvmardi.’
>>> sous_phrase(["Aujourd’hui", "sieste", "et", "sortie", "branche", "rameaux", "trefle"], 3)
’je rame.’

Exercice 4 : Nombre narcissique


Dans cet exercice, on s’intéresse à des entiers naturels particuliers : les nombres narcissiques. Un
nombre n de p chiffres dans son écriture décimale est narcissique s’il est égal à la somme de ses
chiffres élevés à la puissance p. Par exemple :

— L’entier naturel 153 a 3 chiffres dans son écriture, comme 13 + 53 + 33 = 1 + 125 + 27 = 153,
153 est un nombre narcissique.
— L’entier naturel 88 a 2 chiffres dans son écriture, comme 82 + 82 = 64 + 64 = 128, 88 n’est
pas un nombre narcissique.
Les questions de cet exercice visent dans un premier temps à déterminer si un nombre est narcis-
sique. Ensuite, on s’intéresse à la dérivation d’un nombre narcissique à partir d’un entier naturel.


c Sorbonne Université - 1I001 - page 11 -
Groupe Nom Prénom

Question 4.1 : [3/47]


Donner une définition avec signature et hypothèse(s) éventuelle(s) de la fonction nb_chiffres
qui, étant donné un entier naturel n, renvoie le nombre de chiffres dans l’écriture décimale de n.
Par exemple :
>>> nb_chiffres(0)
1
>>> nb_chiffres(8)
1
>>> nb_chiffres(81)
2
>>> nb_chiffres(814)
3

Indice : Si n est un entier naturel, n%10 donne le chiffre des unités de n. Ainsi, par divisions
successives par 10, il est possible de compter les chiffres dans l’écriture décimale de n.


c Sorbonne Université - 1I001 - page 12 -
Groupe Nom Prénom

Question 4.2 : [3/47]


Donner une définition avec signature et hypothèse(s) éventuelle(s) de la fonction somme_chiffres_puissance
qui, étant donné deux entiers naturels n et p, renvoie la somme des chiffres dans l’écriture décimale
de n, chacun élevé à la puissance p.
Par exemple :
>>> somme_chiffres_puissance(153,0)
3
>>> somme_chiffres_puissance(153, 1)
9
>>> somme_chiffres_puissance(153, 2)
35
>>> somme_chiffres_puissance(153, 3)
153

Indice : Si n est un entier naturel, n%10 donne le chiffre des unités de n. Ainsi, par divisions
successives par 10, il est possible de récupérer tous les chiffres dans l’écriture décimale de n.


c Sorbonne Université - 1I001 - page 13 -
Groupe Nom Prénom

Question 4.3 : [2/47]


Donner une définition avec signature et hypothèse(s) éventuelle(s) du prédicat est_narcissique
qui, étant donné un entier naturel n, rend True si n est un nombre narcissique, False sinon.
Par exemple :
>>> est_narcissique(1)
True
>>> est_narcissique(101)
False
>>> est_narcissique(153)
True

Question 4.4 : [4/47]


Soit un entier naturel n. On appelle dérivation narcissique d’ordre 3 à partir de n le processus
itératif suivant :
1. calculer la somme des chiffres, chacun élevé à la puissance 3, de l’écriture décimale de n
2. si le nombre obtenu n’est pas égal à n, remplacer n par la somme obtenue et retourner en 1.
Sinon arrêt du processus.
Si un nombre est narcissique, par exemple 153, alors à la première étape la valeur obtenue est
égale au nombre courant et le processus s’arrête.
Sinon, il est parfois possible d’obtenir un nombre narcissique en quelques étapes. Pour certains
nombres, le processus ne s’arrête pas.
Considérons la valeur 88. Le processus de dérivation narcissique à partir de 88 donne :
— Étape 1 : on calcule 83 + 83 qui vaut 1024. Comme 1024 6= 88, on considère alors la valeur
1024.
— Étape 2 : on calcule 13 + 03 + 23 + 43 qui vaut 73. Comme 73 6= 1024, on considère désormais
73.
— Étape 3 : on calcule 73 + 33 qui vaut 370, qui est différent de 73. On considère donc 370.
— Étape 4 : on calcule 33 + 73 + 03 qui vaut 370 donc 370 est un nombre narcissique. Le
processus s’arrête.


c Sorbonne Université - 1I001 - page 14 -
Groupe Nom Prénom

Ainsi la dérivation narcissique d’ordre 3 à partir du nombre 88 comporte 4 étapes.


Dans cette question, on cherche à déterminer, étant donné un nombre n, s’il est possible d’obtenir
un nombre narcissique en moins de k étapes de dérivation narcissique d’ordre 3. Dans l’affirmative,
on veut déterminer k0 , avec k0 ≤ k, le nombre d’étapes de dérivation.
Donner une définition avec signature et hypothèse(s) éventuelle(s) de la fonction derive_narcissique
qui, étant donné deux entiers naturels n et k, avec k non nul, retourne le nombre d’étapes du pro-
cessus de dérivation narcissique d’ordre 3 inférieur ou égal à k permettant d’obtenir un nombre
narcissique à partir de n. Lorsqu’il n’est pas possible en k étapes d’obtenir un nombre narcissique,
aucune valeur n’est renvoyée.
Par exemple :
>>> derive_narcissique(153,1)
1
>>> derive_narcissique(153,2)
1
>>> derive_narcissique(153,3)
1

Il faut 4 étapes de dérivation pour le nombre 88 comme vu précédemment ainsi :


>>> derive_narcissique(88,3)
>>> derive_narcissique(88,4)
4
>>> derive_narcissique(88,8)
4

Le premier exemple a comme résultat None puisqu’à partir de 88 et en moins de 3 étapes on ne


peut dériver de nombre narcissique.
Remarque : une solution efficace n’utilisera pas la fonction de la question précédente.


c Sorbonne Université - 1I001 - page 15 -
Groupe Nom Prénom


c Sorbonne Université - 1I001 - page 16 -

Vous aimerez peut-être aussi