Skip to content

Commit 729a021

Browse files
Frédéric PeschanskiFrédéric Peschanski
authored andcommitted
new tests
1 parent 9770251 commit 729a021

File tree

2 files changed

+136
-0
lines changed

2 files changed

+136
-0
lines changed

test/progs/42_anagrammes_KO_01.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
##!FAIL: OptionCoercionWarning[str/str + NoneType]@55:18
2+
3+
def moins_lettre(c : str, a : str) -> Optional[str]:
4+
"""Précondition : len(c) == 1
5+
Retourne le mot c privé de la première occurrence du caractère a
6+
si c contient a, ou None sinon.
7+
"""
8+
9+
# première occurrence vue ou non
10+
premiere_trouvee : bool = False
11+
12+
# résultat
13+
res : str = ''
14+
15+
d : str # caractère courant
16+
for d in c:
17+
if d != a:
18+
res = res + d
19+
elif not premiere_trouvee:
20+
premiere_trouvee = True
21+
else:
22+
res = res + d
23+
24+
if premiere_trouvee:
25+
return res
26+
else:
27+
return None
28+
29+
# Jeu de tests
30+
assert moins_lettre('banane', 'a') == 'bnane'
31+
assert moins_lettre('banane', 'u') == None
32+
assert moins_lettre('banane', 'e') == 'banan'
33+
assert moins_lettre('', 'a') == None
34+
35+
36+
## Question 2 - Mots anagrammes
37+
38+
def anagramme(m1 : str, m2 : str) -> bool:
39+
"""Renvoie True quand les mots m1 et m2 sont anagrammes,
40+
ou False sinon.
41+
"""
42+
43+
# copie de m2 à laquelle on va retirer des lettres
44+
cm2 : str = m2
45+
46+
# résultat de la fonction moins_lettre
47+
res : Optional[str] = None
48+
49+
a : str
50+
for a in m1:
51+
res = moins_lettre(cm2, a) # on essaye de retirer a dans la copie courante de m2, cm2
52+
if res == None: # si on n'a pas pu (car cm2 ne contient pas res)
53+
return False # m1 et m2 ne peuvent etre anagrammes
54+
else: # sinon
55+
cm2 = res # cm2 devient l'ancienne cm2 sans la lettre a
56+
57+
return (cm2 == '') # en fin de boucle on vérifie que toutes les lettres ont été
58+
# enlevées. On rend donc True s'il ne reste rien dans cm2
59+
# (cela signifiant que tout à été enlevé) ou False sinon.
60+
61+
62+
# Jeu de tests
63+
assert anagramme("alberteinstein", "alberteinstein") == True
64+
assert anagramme("alberteinstein", "riennestetabli") == True
65+
assert anagramme("alberteinstein", "toutestrelatif") == False
66+
assert anagramme("lagravitationuniverselle", "loivitaleregnantsurlavie") == True
67+
assert anagramme("lesfeuxdelamour", "dramesexuelflou") == True
68+
assert anagramme("iamlordvoldemort", "tommarvoloriddle") == True
69+
assert anagramme("iamharrypotter", "tommarvoloriddle") == False

test/progs/42_anagrammes_OK.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
def moins_lettre(c : str, a : str) -> Optional[str]:
2+
"""Précondition : len(c) == 1
3+
Retourne le mot c privé de la première occurrence du caractère a
4+
si c contient a, ou None sinon.
5+
"""
6+
7+
# première occurrence vue ou non
8+
premiere_trouvee : bool = False
9+
10+
# résultat
11+
res : str = ''
12+
13+
d : str # caractère courant
14+
for d in c:
15+
if d != a:
16+
res = res + d
17+
elif not premiere_trouvee:
18+
premiere_trouvee = True
19+
else:
20+
res = res + d
21+
22+
if premiere_trouvee:
23+
return res
24+
else:
25+
return None
26+
27+
# Jeu de tests
28+
assert moins_lettre('banane', 'a') == 'bnane'
29+
assert moins_lettre('banane', 'u') == None
30+
assert moins_lettre('banane', 'e') == 'banan'
31+
assert moins_lettre('', 'a') == None
32+
33+
34+
## Question 2 - Mots anagrammes
35+
36+
def anagramme(m1 : str, m2 : str) -> bool:
37+
"""Renvoie True quand les mots m1 et m2 sont anagrammes,
38+
ou False sinon.
39+
"""
40+
41+
# copie de m2 à laquelle on va retirer des lettres
42+
cm2 : str = m2
43+
44+
# résultat de la fonction moins_lettre
45+
res : Optional[str] = None
46+
47+
a : str
48+
for a in m1:
49+
res = moins_lettre(cm2, a) # on essaye de retirer a dans la copie courante de m2, cm2
50+
if res == None: # si on n'a pas pu (car cm2 ne contient pas res)
51+
return False # m1 et m2 ne peuvent etre anagrammes
52+
else: # sinon
53+
cm2 = str(res) # cm2 devient l'ancienne cm2 sans la lettre a
54+
55+
return (cm2 == '') # en fin de boucle on vérifie que toutes les lettres ont été
56+
# enlevées. On rend donc True s'il ne reste rien dans cm2
57+
# (cela signifiant que tout à été enlevé) ou False sinon.
58+
59+
60+
# Jeu de tests
61+
assert anagramme("alberteinstein", "alberteinstein") == True
62+
assert anagramme("alberteinstein", "riennestetabli") == True
63+
assert anagramme("alberteinstein", "toutestrelatif") == False
64+
assert anagramme("lagravitationuniverselle", "loivitaleregnantsurlavie") == True
65+
assert anagramme("lesfeuxdelamour", "dramesexuelflou") == True
66+
assert anagramme("iamlordvoldemort", "tommarvoloriddle") == True
67+
assert anagramme("iamharrypotter", "tommarvoloriddle") == False

0 commit comments

Comments
 (0)