Durée : 1h30 — Barème indicatif
list est ordonnée, indexée par entiers, accepte les doublons.
Un set est non ordonné, sans doublons, et ne peut pas être indexé.fib(40) explose ; avec un dict de cache,
chaque valeur n'est calculée qu'une fois.cache = {}
def fib(n):
if n in cache: return cache[n]
if n <= 1: return n
cache[n] = fib(n-1) + fib(n-2)
return cache[n]
(0.5 pt principe, 0.5 pt utilité, 0.5 pt exemple — accepter factorielle avec cache ou tout autre exemple)
"pomme" et "poire".d["pomme"] vaut 5 car la deuxième affectation d["pomme"] = 5 écrase la valeur précédente (3).def comptage_mots(texte):
d = {}
for mot in texte.split():
if mot in d:
d[mot] += 1
else:
d[mot] = 1
return d
Variante acceptée avec .get() : d[mot] = d.get(mot, 0) + 1
def jaccard(s1, s2):
inter = len(s1 & s2) # ou len(s1.intersection(s2))
union = len(s1 | s2) # ou len(s1.union(s2))
if union == 0:
return 0
return inter / union
(1 pt intersection, 0.5 pt union, 0.5 pt division + gestion union=0 — tolérer sans gestion de union=0 si tests avec ensembles non vides)
def factorielle(n):
if n == 0:
return 1
return n * factorielle(n - 1)
(1 pt cas de base n=0, 0.5 pt appel récursif, 0.5 pt return correct — si récursif mais pas de cas de base → infini → 0 pt. Enlever 0.5 si la condition est n≤1 au lieu de n==0 tant que ça marche pour n≥0.)
def normaliser(vecteur):
norme = sum(x**2 for x in vecteur) ** 0.5
return [x / norme for x in vecteur]
Variante avec math.sqrt : import math; norme = math.sqrt(sum(x**2 for x in vecteur))
Moyenne : 15.0
Alice : 15 ★
Bob : 12
Charlie : 18 ★
(1 pt pour la ligne "Moyenne : 15.0", 0.5 pt pour les trois lignes noms, 0.5 pt pour les ★ au bon endroit — pénaliser -0.5 si "Moyenne : 15" sans .0)
k positions dans l'alphabet, en conservant la casse et les caractères non alphabétiques inchangés.notes_alice = {"maths": 15, "francais": 12, "anglais": 18}
notes_bob = {"maths": 8, "francais": 14, "anglais": 10}
moy_alice = sum(notes_alice.values()) / len(notes_alice)
moy_bob = sum(notes_bob.values()) / len(notes_bob)
print("Moyenne d'Alice :", moy_alice)
print("Moyenne de Bob :", moy_bob)
if moy_alice > moy_bob:
print("Alice a la meilleure moyenne")
elif moy_bob > moy_alice:
print("Bob a la meilleure moyenne")
else:
print("Égalité !")
(0.5 pt sum/len pour Alice, 0.5 pt sum/len pour Bob, 0.5 pt affichage des moyennes, 0.5 pt comparaison + résultat final.
Accepter sum(...)/3 en dur au lieu de len(...) si cohérent avec 3 matières. Enlever 0.5 si
le code ne gère pas le cas où les moyennes sont égales.)
["nom", "prenom"] comme clé de dictionnaire.
Les listes ne sont pas hachables (mutable → hash non constant).d[("nom", "prenom")] = "Alice".| Question | Points | Thème |
|---|---|---|
| Q1 | 1 | list vs set |
| Q2 | 1.5 | mémoïsation |
| Q3 | 1.5 | Bag of Words |
| Q4 | 1 | dictionnaire (clés) |
| Q5 | 1 | Jaccard |
| Q6 | 2 | comptage mots |
| Q7 | 2 | Jaccard code |
| Q8 | 2 | factorielle récursive |
| Q9 | 2 | normalisation + compréhension |
| Q10 | 2 | analyse de code (sortie) |
| Q11 | 2 | analyse de code (César) |
| Q12 | 2 | problème dictionnaires |
| B1–B2 | 1 | bonus |
| Total | 20+1 |