Feat(NSI): exercices sur les dictionnaires
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2023-03-26 16:40:46 +02:00
parent 9ba0b57e51
commit 90558ac36b
12 changed files with 1326 additions and 775 deletions

View File

@@ -0,0 +1,61 @@
def chiffre_cesar(message:str, cle:int)->str:
"""
Chiffre un message avec le chiffrement par décalage sur les caractères imprimables ASCII.
:param message: le message à chiffrer
:param cle: décalage à appliquer
:return: le message chiffré
"""
message_chiffre = ""
for caractere in message:
caractere_chiffre = chr((ord(caractere) - 32 + cle) % 95 + 32)
message_chiffre += caractere_chiffre
return message_chiffre
def dechffre_cesar(message_chiffre:str, cle:int) -> str:
""" Déchiffre un message chiffré avec la méthode César"""
return chiffre_cesar(message_chiffre, -cle)
# On souhaite casser ce chiffrement c'est à dire trouver la clé de chiffrement
def signature(message: str) -> dict:
""" Compte le nombre d'occurrences de chaque caractère"""
# à compléter
pass
# Tests à ajouter
def caractere_plus_courant(message:str) -> str:
""" Donne le caractère le plus présent du message
En cas d'égalité, on renverra un des plus présent
"""
assert len(message) > 0
# à compléter
pass
# Ajouter deux tests
assert caractere_plus_courant("uiopyyy") == "y"
def decalage(caractere:str) -> int:
""" En supposant que caractere soit le caractère le plus présent du message, c'est certainement le caractère correspondant à l'espace. On peut donc calculer la clé"""
# à compléter
pass
# Tests (ajouter deux tests)
assert decalage("#") == 3
assert decalage("~") == 94
def trouve_cle(message_chiffre:str) -> int:
""" À partir d'un message chiffré, retrouve la clé"""
# à compléter
pass
def casse_cesar(message_chiffre:str) -> str:
""" À partir d'un message chiffré, déchiffre le message"""
# à compléter
pass
message = "Au théâtre, Victor Hugo s'est imposé comme un des chefs de file du romantisme français en présentant sa conception du drame romantique dans les préfaces qui introduisent Cromwell en 1827, puis Hernani en 1830, qui sont de véritables manifestes, puis par ses autres œuvres dramatiques, en particulier Lucrèce Borgia en 1833 et Ruy Blas en 1838."
# Dans la suite, chiffrer ce message puis essayer de casser le chiffrement avec votre fonction.

View File

@@ -0,0 +1,98 @@
valeur_lettres = {
"a": 1,
"e": 1,
"i": 1,
"o": 1,
"n": 1,
"r": 1,
"t": 1,
"l": 1,
"s": 1,
"u": 1,
"d": 2,
"g": 2,
"b": 3,
"c": 3,
"m": 3,
"p": 3,
"f": 4,
"h": 4,
"v": 4,
"w": 4,
"y": 4,
"k": 5,
"j": 8,
"x": 8,
"q": 10,
"z": 10,
}
## Signature d'un mot
def signature(mot:str) -> dict:
"""Fonction qui compte le nombre de fois que chaque lettre apparait dans le mot
:param mot: le mot à étudier
:return: dictionnaire avec en clé les lettres et en valeur le nombre de fois qu'elles apparaissent
"""
# à compléter
pass
# Ajouter deux tests en plus
assert signature("coucou") == {'c': 2, 'o': 2, 'u': 2}
assert signature("") == {}
## Score d'un mot
def score(mot: str, valeurs: dict) -> int:
""" Calcul le score que fait un mot
:param mot: le mot à étudier
:param valeurs: dictionnaire avec les valeurs de chaque lettre
:return: le score du mot
"""
# à compléter
pass
# Ajouter deux tests en plus
assert score("coucou", valeur_lettres) == 10
assert score("", valeur_lettres) == 0
## Meilleur score
def meilleur_score(mots_possibles:list, valeurs:dict) -> str:
""" Renvoie le mot qui fait le plus de points dans la liste des mots possibles"""
# à compléter
pass
assert meilleur_score(["coucou", "hop"], valeur_lettres) == "coucou"
autres_valeurs_lettres = {
"a": 1,
"e": 1,
"i": 1,
"o": 1,
"n": 1,
"r": 1,
"t": 1,
"l": 1,
"s": 1,
"u": 1,
"d": 2,
"g": 2,
"b": 3,
"c": 3,
"m": 3,
"p": 3,
"f": 4,
"h": 100,
"v": 4,
"w": 4,
"y": 4,
"k": 5,
"j": 8,
"x": 8,
"q": 10,
"z": 10,
}
assert meilleur_score(["coucou", "hop"], autres_valeurs_lettres) == "hop"