BCPST 1B TD 4 : Informatique Entraînement au devoir du jeudi 4 décembre 2013 Pour cet entraînement vous pouvez évidemment utiliser les ordinateurs. (1 h 30 minutes) (Il est un peu long pour cette durée ! ) Au cours de cette interrogation vous avez droit à vos notes de cours, correction de TD ... Vous n'avez, en revanche, pas le droit à votre téléphone. Si au cours de l'épreuve un candidat repère ce qui lui semble être une erreur d'énoncé, il le signalera sur sa copie et poursuivra sa composition en expliquant les raisons des initiatives qu'il sera amené à prendre. La version de Python de référence pour cette interrogation est la version 3.4.1. Ce sujet comporte cinq pages. Vous ne devez pas rendre ce sujet. −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− Exercice 1 1) On considère le programme suivant u,v=1,1 while u<10: u,v=v,u+v print(v) 2) Combien y a-t-il de variables dans ce programme et quel est leur type ? 3) Donner l'évolution de ces variables tout au long du programme. 4) Quelle est la valeur achée à la n du programme ? 5) (Dans cette question on n'utilise pas le programme ci-dessus). Soit (un ) dénie par : u0 = −1, u1 = 2 et ∀n ∈ N, un+2 = 2un+1 + 3un + 4 Ecrire un programme répondant à la question suivante : "Déterminer quel est le premier entier n pour lequel un > 500 000." justier votre programme par une simulation de boucle. 1 Exercice 2 (Suite de Syracuse ) 1) On considère le programme suivant : u=2014 n,m=0,0 while u!=1: if u%2==0: u=u//2 n=n+1 else: u=3*u+1 m=m+1 print(n,m) Voilà ce qu'ache Python à son exécution : Kernel process terminated for restart. (0) Python 3.4.1 |Continuum Analytics, Inc.| (default, May 19 2014, 13:02:30) on Windows (64 bits). This is the IEP interpreter with integrated event loop for PYSIDE. Type 'help' for help, type '?' for a list of *magic* commands. Running script: "D:\Python\2014-2015\Cours fonctions\test2.py" 62 32 >>> 2) 3) 4) 5) Quel est le type des variables u, n et m ? Traduire la condition u%2==0. Combien de "tours de boucle" fait la boucle while ? Simuler les six premiers tours de cette boucle while ? tours de boucle entrée 1er tour 2e tour 3e tour 4e tour 5e tour 6e tour variable u variable n variable m Remarque : On appelle suite de Syracuse une suite d'entiers dénie par : u0 un entier naturel non nul et la relation de récurrence : si un est pair, un+1 = 0,5 un si un est impair, un+1 = 3un + 1 : Une telle suite va nécessairement prendre la valeur 1 quelle que soit la valeur de u0 . Conjecture de Syracuse Vous pouvez essayer de le démontrer, mais ne perdez pas trop de temps, aucun mathématicien n'est venu à bout de ce problème ! 2 Exercice 3 Des boucles dans des boucles. 1) Une boucle for dans une boucle for. S=0 for i in range(5): for j in range(6): S=i+2*j print(S) S=0 for i in range(1,6): for j in range(1,i+1): print(i,j) S=S+1 print(S) Programme1.py S=0 for i in range(5): for j in range(i,5): print(i,j) S=S+1 print(S) Programme2.py Programme3.py Ê Décrire les achages de ces trois programmes. Ë Que fait la fonction "mystère" suivante ? def f(n): S=0 for i in range(n+1): for j in range(n+1): for k in range(n+1): if i+j+k==n: S=S+1 return S 2) Une boucle for dans une boucle while. A quel problème répond le programme suivant ? n=2 S=1 while S%11!=0: n=n+1 S=0 for j in range(2,n): S=S+int(n/j)**3 # print(S,n) 3) Une boucle while dans une boucle for. Suite de Syracuse. On considère le programme suivant : for u in range(2,2101): v=u n=0 while u!=1: if u%2==0: u=u//2 else: u=3*u+1 n=n+1 if n==94: print(v,end=' ') qui donne : >>> 364 365 366 1986 1987 2014 2015 2075 3 int(n/j) = n//j Ê A quelle question sur les suites de syracuse répond ce programme ? Ce programme serait plus simple avec la création d'une fonction : def longueur(u): n=0 while u<>1: n=n+1 if u%2==0: u=u//2 else: u=3*u+1 return n Ë Ecrire la spécication de la fonction longueur. Ì Réécrire le programme précédent en utilisant cette fonction longueur(u). 4) Une boucle while dans une boucle while. Ê On considère la suite (un ) dénie par : u0 = 2, u1 = 5 et ∀n ∈ N, un+2 = 5un+1 − 6un Ecrire un programme Python qui ache les 20 premiers n pour lesquels un est divisible par 11. On rappelle que la condition : x%11==0 signie : "x est divisible par 11" Ë Que fait la fonction "mystère" suivante ? def f(T): """str->list[int] T ne contient que les caractères 'a' et 'b'. mystère""" S=[] n=len(T) k=0 while k<n: x=T[k] j=0 while k+j<n and T[k+j]==x: j=j+1 S+=[j] k=k+j return S Exercice 4 Compression et décompression. Dans cet exercice, nous illustrons un problème de compression de chaînes de caractères selon l'approche run-length encoding (RLE). Le principe de la compression est simple : si la chaîne contient (strictement) plus d'une occurrence successive du même caractère, comme par exemple le caractère 'c' dans 'abcccd', alors on remplace les n occurrences par le nombre n suivi du caractère répété, par exemple 'ab3cd' (car c est répété 3 fois). On supposera bien sûr que les chaînes à compresser ne contiennent pas déjà des chires. Par exemple : >>> compression('abcccd') 'ab3cd' >>> compression('abcdefg') 'abcdefg' >>> compression('abcccddeeeefgh') 'ab3c2d4efgh' 4 La fonction suivante retourne la version compressée de la chaine T. def compression(T): """str->str T contient une chaine de caractères sans chiffre retourne T sous forme compressée suivant la méthode RLE""" n=len(T) k=0 S='' while k<n: x=T[k] j=1 while k+j<n and T[k+j]==x: j=j+1 if j>1: S=S+str(j) S=S+x k=k+j return S Ê Quel est le type des variables T , j , S , k ? Ë Eectuer la simulation de boucle correspondant à l'évaluation : compression('aabbbbccaa') On prendra pour modèle le tableau suivant : tours de boucle entrée 1er tour 2e tour variable j variable S variable k Fonction de décompression. On s'intéresse ici à la fonction qui à partir d'un texte compressé par compression, permet de retrouver le texte original. On cherche donc la fonction réciproque de compression. >>> decompression('ab3cd') 'abcccd' >>> decompression('ab3c2d4efgh') 'abcccddeeeefgh' >>> decompression('abcdefg') 'abcdefg' Une fonction utile ici : est_chiffre permettant de reconnaître un caractère représentant un chire. def est_chiffre(c): """str -> bool Hypothèse : len(c) == 1 retourne True si, et seulement si, c est un chiffre.""" return ('0'<=c) and (c<='9') Par exemple : est_chiffre('4') renvoie True est_chiffre('a') renvoie False Ì Donner une dénition de la fonction decompression. (Autrement dit : Ecrire une fonction Python qui réalise la décompression) On pourra commencer par considérer que les nombres de répétitions ne dépassent pas 9. 5