Aller au contenu

Caviarder un texte⚓︎

Avant de rendre public des dossiers sensibles, il arrive que certains organismes les « anonyment » en entier ou partiellement.

Dans le cadre de cet exercice, nous ne programmons qu'une version simpliste : « caviarder » un texte consiste à remplacer toutes les caractères alphabétiques situées dans une certaine plage d'indices par le caractère #.

Par exemple, pour le texte L'espion était J. Bond et les indices 15 (caractère J) et 21 (d) on obtient L'espion était #. ####.

On demande d'écrire la fonction caviarder qui prend en argument une chaîne de caractères texte, deux entiers debut et fin et renvoie le même texte caviardé entre les caractères d'indices debut et fin (inclus l'un et l'autre).

On garantit que debut est toujours inférieur ou égal à fin.

Selon l'usage informatique, le premier caractère de texte a pour indice 0. Ainsi le caractère d'indice 1 de "Hello" est "e".

Astuce

Si s est une chaîne de caractères, l'instruction s.isalpha() renvoie True si s n'est composée que de caractères alphabétiques.

Ainsi "é".isalpha() est évalué à True, "Bonjour !".isalpha() est évalué à False.

Exemples

🐍 Console Python
>>> caviarder("L'espion était J. Bond", 15, 21)
"L'espion était #. ####"
>>> caviarder("Paul est un espion", 100, 200)
'Paul est un espion'
###
from random import randint, choice, samplebksl-nlbksl-nl# Testsbksl-nlassert caviarder("L'espion était J. Bond", 15, 21) == "L'espion était #. ####"bksl-nlassert caviarder("Paul est un espion", 100, 200) == "Paul est un espion"bksl-nlbksl-nlbksl-nl# Tests supplémentairesbksl-nlALPHABET = "".join(chr(i) for i in range(ord("A"), ord("A") + 26))bksl-nlALPHABET += "".join(chr(i) for i in range(ord("a"), ord("a") + 26))bksl-nlPONCTUATION = " ,;:!?.()[]'"bksl-nlbksl-nlfor py-und in range(10):bksl-nl nbpy-undlettres = randint(1, 20)bksl-nl nbpy-undponctuation = randint(1, 20)bksl-nl texte = "".join([choice(ALPHABET) for py-und in range(nbpy-undlettres)])bksl-nl texte += "".join([choice(PONCTUATION) for py-und in range(nbpy-undponctuation)])bksl-nl texte = "".join(sample(texte, len(texte)))bksl-nl debut = randint(0, len(texte) - 1)bksl-nl fin = randint(debut, len(texte) - 1)bksl-nl attendu = "".join(bksl-nl ["#" if debut <= i <= fin and c.isalpha() else c for i, c in enumerate(texte)]bksl-nl )bksl-nl assert (bksl-nl caviarder(texte, debut, fin) == attendubksl-nl ), f"Erreur avec {texte} entre les indices {debut} et {fin}"bksl-nlbksl-nl 5/5

def caviarder(texte, debut, fin):bksl-nl ...bksl-nlbksl-nlbksl-nl# Testsbksl-nlassert caviarder("L'espion était J. Bond", 15, 21) == "L'espion était #. ####"bksl-nlassert caviarder("Paul est un espion", 100, 200) == "Paul est un espion"bksl-nlbksl-nldef caviarder(texte, debut, fin):bksl-nl resultat = ""bksl-nl for i in range(len(texte)):bksl-nl caractere = texte[i]bksl-nl if debut <= i <= fin and caractere.isalpha():bksl-nl resultat += "#"bksl-nl else:bksl-nl resultat += caracterebksl-nlbksl-nl return resultatbksl-nlbksl-nlbksl-nl# Testsbksl-nlassert caviarder("L'espion était J. Bond", 15, 21) == "L'espion était #. ####"bksl-nlassert caviarder("Paul est un espion", 100, 200) == "Paul est un espion"bksl-nlbksl-nl

A

La fonction caviarder n'effectue des transformations que sur une certaine plage d'indices. La boucle for doit donc se faire sur ceux-ci.

Il est aussi possible d'écrire cette fonction en utilisant une approche plus « fonctionnelle » :

🐍 Script Python
def caviarder(texte, debut, fin):
    return "".join(["#" if debut <= i <= fin and c.isalpha() else c for i, c in enumerate(texte)])

Z