Informatique tronc commun DS 1
20 décembre 2013
Nota Bene :
1. Il faut utiliser Python 2 et non Python 3.
2. Ce devoir est à faire de façon individuelle.
3. Pour mettre en place votre répertoire de devoirs, démarrez une fenêtre de com- mandes (terminal) et tapez la commande suivante (pour les MPSI2, remplacer mps1 par mps2) :
sh ~/groupes/mps1/donnees/ds-info/mise-en-place
Si tout se passe bien, rien n’est affiché. Sinon, un message d’erreur s’affiche (comprenez- le, lisez-le et faites appel à votre enseignant en cas de problème).
4. Cette commande a créé un répertoireDocuments/devoirs/ds-info dans votre ré- pertoire personnel. Dans la suite, ce répertoire est appelé répertoire du DS.
5. Le travail demandé est à faire avec un fichier qui doit s’appelerprog.pyet doit être créé dans le répertoire du DS. Pour vous faciliter le travail, un tel fichier, quasiment vide, y a déjà été créé.
6. Vous trouverez également dans le répertoire du DS un fichier testeur.pyqui vous permettra de tester votre programme et sera utilisé pour le noter. Ce fichier n’est pas à modifier mais si vous le détruisez par erreur, à tout moment vous pouvez le retrouver en lançant la commande de mise en place décrite au point 3.
7. Pour travailler, on rappelle qu’il convient de démarrer IDLE1 et d’ouvrir (menu File/Open) le fichier prog.py puis le fichier testeur.py. Pour lancer les tests, il suffit de se placer dans la fenêtre d’édition detesteur.pyet de taper F5 (ou menu Run/Run Module).
8. À la fin du DS, votre enseignant vous indiquera le moment où il récupère l’état précis de votre fichier. Il est préférable à ce moment-là que le maximum de tests passent. Il vaut donc mieux renoncer à écrire une fonction de plus que risquer d’avoir un programme qui contient une erreur de syntaxe (ce qui conduirait à ne pas avoir le moindre test qui fonctionne).
1. Attetion à prendre la version 2 et non la version 3.
9. Si vous avez un doute sur le nombre de tests qui fonctionnent, vous pouvez lancer la commande suivante (remplacez mps1 par mps2 pour les MPSI2) :
sh ~/groupes/mps1/donnees/ds-info/verifie
Elle remet en place le bon fichier testeur.py et lance les tests (il se peut que certains tests mettent jusqu’à 10s, en fonction de ce que vous avez fait) et vous affiche le résultat (les trois dernières lignes sont celles qui détermineront la note de votre devoir).
10. Vous avez le droit d’aller lire toute documentation utile sur le Web (mais évidem- ment pas d’échanger avec un correspondant, que ce soit par courriel ou messagerie instantanée). Vous aller le droit d’aller lire les forums de discussion mais pas d’y écrire.
11. Si cela vous facilite la tâche pour écrire une fonction demandée, vous avez intérêt à utiliser les fonctions que vous avez déjà écrites auparavant ou même à introduire des fonctions non demandées.
1 Comptabilité
Le service comptabilité d’une entreprise veut prévoir les rentrées d’argent. Elle reçoit la liste des commandes effectuées, chaque commande étant une liste de plusieurs articles.
Pour simplifier, on considérera en fait qu’une commande est juste la liste des valeurs (en euros) des articles composant la commande (on supposera que ces valeurs sont des entiers).
Pour chaque commande, le client doit payer la somme des valeurs plus des frais de port, égaux à5esi le montant total de la commande est strictement inférieur à50eet gratuits si le montant total de la commande est supérieur ou égal à50 e.
Le service comptabilité désire calculer le montant total qui doit lui être versé par les clients pour ces commandes.
Cette liste de commandes peut être représentée de façon textuelle, c’est-à-dire sous forme d’une chaîne de caractère, comprenant (possiblement) plusieurs lignes, chaque ligne non-vide correspondant à une commande (on peut ajouter des lignes vides), et où chaque ligne contient les valeurs des articles composant la commande, séparées par des espaces. C’est la forme sous laquelle elle arrive au service comptabilité.
Elle peut être représentée de façon structurée, c’est-à-dire sous la forme d’une liste python, dont chaque élément est une liste python d’entiers naturels.
1. Écrire une fonction analyse_commandes(s) prenant en argument une chaîne de caractère s représentant textuellement une liste de commandes et retournant la représentation structurée de cette liste.
2. Écrire une fonctionmontant_total(t) prenant en argument une liste de commandes représentée de façon structurée et retournant le montant total qui doit être versé par les clients pour ces commandes.
2 Comptage de nombres
Étant donné un entier naturel non nul n, on appelle diviseur strict de n tout entier naturel autre que ndivisant n.
Pour n∈N∗, on note σ(n) la somme des diviseurs stricts de n.
1. Écrire une fonctionsomme_diviseurs_stricts(n) calculant σ(n). NB : points bo- nus si votre fonction est capable de calculer la somme des diviseurs d’un nombre de l’ordre de240 en quelques secondes
2. Écrire une fonction compte(n) comptant le nombre de paires distinctes d’entiers naturels {p, q} vérifiant (p, q) ∈ [[1, n[[2, σ(p) = q et σ(q) = p. NB : pour que {p, q} soit une paire, il est nécessaire que p 6= q. NB : points bonus si votre fonction est capable de calculercompte(20000) en quelques secondes.
3 Calculs de dates
Dans cet exercice, on appelleradate SLS une date représentée sous la forme du nombre de secondes écoulées depuis le27décembre1973, à0h00. On posera par la suiteye= 1973, me = 12, je = 27. On supposera par la suite que toutes les dates manipulées sont postérieures à cette date.
Un moment de la journée est la donnée d’un triplet d’entiers (h, m, s) où h∈[[0,24[[, m∈[[0,60[[,s∈[[0,60[[.
On appellera date d’une année la donnée d’un couple(m, j) oùm est le numéro d’un mois (m ∈ [[0,13[[) et j le numéro d’un jour dans ce mois (j ∈ [[1, k+ 1[[ où k est le nombre de jours du moismpour l’année considérée — pour le mois de février, ce nombre dépend de l’année considérée).
On appelleradate sous forme usuellela donnée d’un sextuplet d’entiers(a, m, j, h, min, s), représentant le moment de la journée(h, min, s) de la date(m, j)de l’année a.
1. Écrire une fonctionsecondes(j,h,m, s) prenant en argument des entiersj,h,met set retournant la durée, en secondes, dejjours,hheures,mminutes etssecondes.
2. Écrire une fonction duree(d) prenant en argument un nombre entier de secondes et retournant cette durée sous la forme d’un quadruplet (j, h, m, s) représentant j jours, h,m ets (avech∈[[0,24[[,m∈[[0,60[[ets∈[[0,60[[).
3. On désire écrire une fonction convertissant une date en une date SLS et récipro- quement. Une des difficultés réside dans le calcul des années bissextiles.
Écrire une fonction bissextile(a) prenant en argument une année a et retour- nant le booléenTruesia est une année bissextile etFalse sinon. Notre calendrier (calendrier grégorien) adopte les règles suivantes pour déterminer si une année est bissextile ou non :
a) Les années multiples de4 sont bissextiles les autres non.
b) La règle précédente ne s’applique pas si l’année est un multiple de 100: une année multiple de100est bissextile si et seulement si elle est multiple de400.
Ainsi1973n’est pas bissextile, 1976l’est,2000aussi mais pas2100.
4. Écrire une fonctionnb_bissextiles(a1,a2) prenant en argument deux annéesa1 et a2 et retournant le nombre d’années bissextiles dans l’intervalle range(a1,a2) (on pourra supposer 1973 <=a1 <=a2). Indication : on pourra écrire une fonction nb_bissextiles0(a) qui retourne le nombre d’années bissextiles dans le calendrier grégorien sur l’intervalle d’années range(a) (cela n’a pas de sens sur le plan his- torique, le calendrier grégorien n’ayant été introduit qu’au XVIe siècle mais peut faciliter le calcul).
5. Écrire une fonction jours(m,j) retournant le nombre de jours écoulés entre le premier janvier de l’année en cours et la date (m, j) d’une année non bissextile.
Ainsijours(1,1) doit retourner 0 etjours(2, 1) doit retourner31.
6. Écrire une fonctionmois_jours(n), oùn∈[[0,365[[retournant la date(m, j)d’une année non bissextile telle quemois_jours(m,j) ==n.
7. Écrire des fonctions jours_b(m,j) et mois_jours_b(n) faisant de même pour une année bissextile.
8. Écrire une fonctionSLS(a, m, j, h, min, s) retournant la date SLS représentant la date usuelle(a, m, j, h, min, s).
9. Écrire une fonctiondate(d) retournant la date usuelle (a, m, j, h, min, s) représen- tant la date SLS d.
4 Code orange
En France, lorsqu’une lettre est envoyée par la poste, il lui est attribué un identifiant (unique) qui est un mot dekchiffres binaires, c’est-à-dire une suite dekzéros ou de uns (typiquementk est de l’ordre de30).
Cet identifiant est écrit sur l’enveloppe sous la forme d’une succession de petites barres de couleur orange fluorescentes : un1est codé par une barre, un0par l’absence de barre.
Cet identifiant peut par la suite être lu par les machines qui traitent le courrier. Une tête de lecture suit ce code, note l’espacement entre les barres et en déduit la séquence de zéros et de uns de l’identifiant. Cependant, la tête de lecture échoue si l’espace entre deux barres successives est trop grand, c’est-à-dire si le nombre de zéros successifs dans l’identifiant est trop élevé.
On considérera par la suite qu’un identifiant est illisible par la machine si et seulement s’il possède au moins une séquence d’au moins K zéros successifs (typiquement K= 5).
Par exemple aveck= 10etK = 3, l’identifiant0010101010est lisible mais1000110100 ne l’est pas.
On notera Mk,K l’ensemble des mots binaires distincts de longueur k lisibles etNk,K le cardinal de cet ensemble.
1. Écrire une fonction nb_mots(n,K) retournant le tableau t de longueur n tel que pour tout k∈[[0, n[[,t[k] est égal à Nk,K. Indications :
a) Pour k < K, t[k] est simplement le nombre de mots binaires de longueur k (en particulier t[0] vaut1) ;
b) Pourk≥K, on peut remarquer que tout mot lisible de longueurkcommence soit par1, soit par 01, soit par 001, . . . , soit par K−1 zéros suivis d’un un.
Cela permet de calculert[k] à partir dest[i] pouri < k.
2. Pour gérer les lettres dans le système d’information de la poste, il est plus pratique de les repérer par des entiers que par des éléments deMk,K. OrMk,K et[[0, Nk,K[[, ayant même nombre d’éléments, il existe évidemment une bijection entre ces deux éléments. L’ensemble[[0, Nk,K[[étant muni de l’ordre usuel et l’ensembleMk,Kétant muni de l’ordre lexicographique2, il existe même une et une seule bijection fk,K qui soit (strictement) croissante.
Écrire une fonction code(k,K, n) calculant fk,K(n). On représentera un élément bk−1. . . b1b0 de Mk,K par un tableau t de longueur k, tel que pour touti∈[[0, k[[, on aitt[i]=bi.
3. Écrire une fonctiondecode(k,K, t) calculantfk,K−1(t)oùtest un mot binaire repré- senté de la même manière que dans la question précédente.
2. L’ordre du dictionnaire, en considérant ici que la «lettre»0vient avant la «lettre»1. Ainsi, pour les mots à deux chiffres, on a00<01<10<11.