Aller au contenu

TP Python – Mesures et explosions

BTS SIO SISR 2e année – Pour aller plus loin – S15

Note

Comment ce TP fonctionne. Chaque exercice a un éditeur Python intégré à la page (il s'exécute dans ton navigateur, rien à installer). Avant de lancer, écris sur ta feuille ce que tu anticipes (« J'anticipe »). Puis lance et compare. Le bouton Valider exécute des tests : un test réussi ne dispense pas de comprendre pourquoi.

Exercice A – Temps minimal

Écris temps_min(f, repetitions) qui appelle f() repetitions fois, mesure chaque durée avec time.perf_counter() et renvoie la plus petite (un float positif ou nul).

J'anticipe. Pourquoi garder le minimum plutôt que la moyenne ?

###
assert isinstance(tempspy-undmin(lambda: 1, 3), float)bksl-nlassert tempspy-undmin(lambda: sum(range(100)), 5) >= 0bksl-nlassert (lambda c: (tempspy-undmin(lambda: c.append(1), 4), len(c))[1])([]) == 4bksl-nlbksl-nl ∞/∞

import timebksl-nlbksl-nlbksl-nldef tempspy-undmin(f, repetitions):bksl-nl """Plus petite duree (en secondes) de repetitions appels de f()."""bksl-nl ...bksl-nlbksl-nl



Exercice B – Essais de force brute

Écris essais_force_brute(taille_alphabet, longueur) qui renvoie le nombre d'essais de la force brute.

J'anticipe. Retrouve les valeurs de l'exercice 2.

###
assert essaispy-undforcepy-undbrute(26, 8) == 208827064576bksl-nlassert essaispy-undforcepy-undbrute(26, 12) == 95428956661682176bksl-nlassert essaispy-undforcepy-undbrute(62, 12) == 3226266762397899821056bksl-nlassert essaispy-undforcepy-undbrute(10, 4) == 10000bksl-nlbksl-nl ∞/∞

def essaispy-undforcepy-undbrute(taillepy-undalphabet, longueur):bksl-nl """Nombre d'essais de la force brute."""bksl-nl ...bksl-nlbksl-nl



Exercice C – Durée de la force brute

Écris jours_force_brute(taille_alphabet, longueur, par_seconde) qui renvoie la durée maximale en jours (tous les essais) à par_seconde essais par seconde.

###
assert abs(jourspy-undforcepy-undbrute(26, 8, 1e9) py-str 86400 - 208.827) < 0.001bksl-nlassert abs(jourspy-undforcepy-undbrute(26, 12, 1e9) / 365 - 3.026) < 0.001bksl-nlassert abs(jourspy-undforcepy-undbrute(10, 4, 1) - 10000 / 86400) < 1e-9bksl-nlbksl-nl ∞/∞

def jourspy-undforcepy-undbrute(taillepy-undalphabet, longueur, parpy-undseconde):bksl-nl """Duree maximale en jours."""bksl-nl ...bksl-nlbksl-nl



Je comprends. Quelle est ton hypothèse de vitesse ? Pourquoi faut-il toujours l'annoncer ?

Exercice D – Nombre de tournées

Écris nb_tournees(n) qui renvoie (n - 1)! pour n >= 1. Calcule la factorielle avec une boucle (sans math.factorial).

###
assert nbpy-undtournees(8) == 5040bksl-nlassert nbpy-undtournees(10) == 362880bksl-nlassert nbpy-undtournees(15) == 87178291200bksl-nlassert nbpy-undtournees(20) == 121645100408832000bksl-nlassert nbpy-undtournees(1) == 1bksl-nlassert nbpy-undtournees(2) == 1bksl-nlbksl-nl ∞/∞

def nbpy-undtournees(n):bksl-nl """(n-1)! : nombre d'ordres de visite, premier site fixe."""bksl-nl ...bksl-nlbksl-nl



Exercice E – Doublons avec un ensemble

Écris doublons_set(L) qui renvoie True si L contient au moins deux éléments égaux, en utilisant un ensemble (set).

###
assert doublonspy-undset([1, 2, 3, 4]) == Falsebksl-nlassert doublonspy-undset([1, 2, 1, 4]) == Truebksl-nlassert doublonspy-undset([]) == Falsebksl-nlassert doublonspy-undset([5]) == Falsebksl-nlassert doublonspy-undset(["a", "b", "a"]) == Truebksl-nlassert doublonspy-undset(list(range(1000))) == Falsebksl-nlbksl-nl ∞/∞

def doublonspy-undset(L):bksl-nl """True si L contient un doublon (avec un ensemble)."""bksl-nl ...bksl-nlbksl-nl



Je comprends. Quel est le coût mémoire de cette méthode ?