site de Fabien Torre


Travaux pratiques Perl

Des exercices de programmation Perl dédiée à la manipulation de textes, en particulier avec des applications en linguistique, sociologie, open data, visualisation de données, etc.

A. Prise en main de perl

[ 1 ] Affichages et premières boucles

  1. Écrire une boucle perl qui affiche les entiers de 1 à 10. Utiliser d'abord une boucle while puis essayer avec une boucle for.
  2. Généraliser au sein d'une procédure avec un paramètre.
  3. Définir un tableau d'entiers, puis un tableau de mots.
  4. Proposer une procédure permettant d'afficher le contenu de tels tableaux.

B. Production automatique de textes

[ 2 - traitement de la langue ] Nom d'agent dérivé d'un verbe

  1. Définir une variable contenant le verbe chanter.
  2. Supprimer les deux dernières lettres de ce mot et les remplacer par les lettres eur.
  3. Produire une phrase intégrant ces deux mots et explicitant leur lien sémantique.
  4. Généraliser ce code en écrivant une procédure traitant n'importe quel verbe du premier groupe.
  5. Définir un tableau perl contenant plusieurs verbes du premier groupe.
  6. Ajouter au programme perl une boucle sur ce tableau et un appel à la procédure pour chacun des verbes.

[ 3 - traitement de la langue ] Construction de verbes par préfixation en dé-

  1. Définir une variable contenant un verbe comme chanter ou axer.
  2. Récupérer la première lettre du verbe.
  3. Tester si cette première est une voyelle ou non et lui ajouter le préfixe adéquat pour produire un nouveau verbe (déchanter ou désaxer).
  4. Afficher une phrase présentant le résultat.
  5. Concevoir sur papier l'algorithme précis qui à partir d'un verbe construit le verbe décrivant le processus inverse. Il permettra en particulier de traiter sans erreur les verbes chanter, axer, boucher, saler, équilibrer, hydrater et stabiliser.
  6. Écrire une fonction qui prend une lettre en entrée et qui renvoie vrai ou faux selon que la lettre est une voyelle ou non. Cette fonction pourra :
    • soit utiliser un SI ALORS SINON dont la condition est une disjonction de tests d'égalités sur les voyelles ;
    • soit définir un tableau perl contenant les voyelles et utiliser une boucle pour parcourir ce tableau à la recherche de la lettre fournie.
  7. Fournir une procédure qui implémente l'algorithme de préfixation en dé-.
  8. Définir un tableau de verbes.
  9. Ajouter une boucle pour tester la procédure écrite vis-à-vis de chaque verbe du tableau.
  10. Proposer la lecture d'un fichier de verbes et la production d'une page html.

[ 4 ] Conjugaison automatique

  1. Définir une variable contenant un verbe, soit du premier groupe, soit du deuxième groupe.
  2. Définir un tableau à six cases contenant les pronoms personnels.
  3. Définir un tableau contenant les marques de conjugaison au présent de l'indicatif pour les verbes du premier groupe, et un autre pour les terminaisons des verbes du deuxième groupe.
  4. Écrire un test qui décide si le verbe défini appartient au premier ou au deuxième groupe.
  5. Produire l'affichage des formes conjuguées de ce verbe au présent de l'indicatif, chaque forme étant précédée du ou des pronom(s) personnel(s) adéquat(s).
  6. Définir un tableau de verbes et produire à l'aide d'une boucle les conjugaisons pour chaque verbe.
  7. Revenir sur le code déjà écrit et proposer des procédures pertinentes.
  8. Travailler la sortie (apparence utilisant HTML) et les entrées (lire ce qui peut l'être dans des fichiers).

[ 5 ] Pipotron façon radio Londres

  1. Définir un tableau de verbes et un tableau de groupes nominaux.
  2. Tirer au hasard un groupe nominal, un verbe et un cod.
  3. Conjuguer automatiquement le verbe en fonction du groupe nominal choisi. Utiliser pour cela le code de l'exercice précédent, placé dans une fonction.
  4. Combiner les trois éléments pour obtenir une phrase.
  5. Lire verbes et groupes nominaux dans des fichiers et produire un fichier html de cent phrases produites aléatoirement.

C. Lecture de fichiers, expressions régulières et production html

[ 6 ] Catalogue de jouets

  1. Récupérer le fichier kdos.txt et le dossier kdos-images.
  2. Avec perl, parcourir le fichier et pour chaque jouet récupérer chacune des informations disponibles (numéro, intitulé et description).
  3. Produire ces informations dans un fichier html auquel est associé une feuille css.
  4. Faire apparaître l'image associée à chaque jouet.
  5. Répérer et distinguer les jouets utilisant des piles.
  6. Mettre en avant l'âge éventuellement associé à chaque jouet.

[ 7 ] Production d'une FAQ en html

  1. Récupérer le fichier FAQ-LaTeX.txt.
  2. Parser le contenu et le présenter en html, en particulier faire apparaître les titres de sections et de sous-sections.
  3. Rendre cliquable les url présentes dans le fichier texte.
  4. Activer également les références internes au document.
  5. Détecter les palindromes présents dans le texte.
  6. Idem en produisant une page de sommaire et un fichier html par sous-section. Ce rendu serait par exemple jugé satisfaisant.

D. Manipulations du dictionnaire

[ 8 ] Expressions régulières et dictionnaire

Parcourir les mots du fichier-dictionnaire et afficher uniquement les mots qui :

  1. commencent par une voyelle,
  2. ne sont composés que de voyelles,
  3. ne contiennent aucune voyelle,
  4. comportent deux x,
  5. comportent trois y,
  6. comportent quatre z,
  7. contiennent au moins un caractère qui n'est pas une lettre,
  8. ne sont composés que de lettres en majuscule,
  9. sont des palindromes.

[ 9 - traitement de la langue ] Travaux sur un dictionnaire

Nous revenons sur l'exercice concernant les noms d'agent dérivés d'un verbe. Il s'agit d'obtenir tous les noms plausiblement construits par le processus discuté en cours (et seulement par lui), en écartant au mieux les erreurs.

  1. Reprendre la liste des verbes du premier groupe et le code produisant pour chacun le nom d'agent correspondant : vérifier que ces noms sont bien dans le dictionnaire et faire apparaître ceux qui n'y sont pas.
  2. Parcourir le dictionnaire à la recherche des mots se terminant par -eur.
  3. S'assurer pour chaque candidat que le verbe correspondant existe bien dans la langue française (ou autrement dit, qu'il est bien présent dans notre dictionnaire).
  4. Stocker les candidats dans un fichier texte.

Nous voulons maintenant trouver dans le dictionnaire les verbes susceptibles d'avoir été construits par une préfixation en dé- d'un verbe existant et décrivant donc un processus inverse. Il s'agit d'obtenir tous les verbes plausiblement construits par cette méthode de préfixation, tout en minimisant le nombre de mots sélectionnés qui ne sont pas de tels verbes.

  1. Lire le fichier-dictionnaire (un mot par ligne) et passer en revue les mots du dictionnaire.
  2. Retenir ceux qui d'après leurs terminaisons sont susceptibles d'être des verbes à l'infinitif.
  3. Ne garder que ceux présentant l'un des préfixes vus en cours.
  4. Vérifier que le mot privé de son préfixe est bien dans le dictionnaire.
  5. Enfin, stocker les candidats dans un fichier texte.

Dernière tâche sur le dictionnaire...

  1. Trouver les mots construits à partir d'un préfixe comme hippo-, aéro-, rhino-, poly-, biblio-, etc.
    ou d'un suffixe comme -thèque, -vore, -phage, -mètre, -culture, etc.

E. Travaux sur corpus

[ 10 ] Extraction des entreprises depuis le corpus des curriculum vitae

  1. Implémenter le parcours, ligne par ligne, du fichier contenant le corpus.
  2. N'afficher que les lignes correspondant à des expériences professionnelles.
  3. Extraire de ces lignes d'expériences les noms des entreprises employeuses.
  4. Produire la liste des entreprises, sans redondance, par ordre alphabétique.
  5. Compter les nombres d'occurrences de chaque entreprise dans le corpus et faire apparaître ces compteurs dans la liste des entreprises.
  6. Ordonner cette liste, de l'entreprise la moins fréquente dans le corpus à la plus fréquente.

[ 11 - sociologie ] Extractions et visualisations depuis une base de prénoms

  1. Récupérer le fichier « France » des prénoms de l'INSEE au format .csv. Lire et comprendre la documentation.
  2. Compter le nombre de naissances depuis 1900.
  3. Donner le nombre de prénoms distincts. Idem en se restreignant aux femmes, puis aux hommes.
  4. Produire le classement des prénoms du moins fréquent au plus fréquent, de 1900 à aujourd'hui.
  5. Pour chaque année et chaque sexe, indiquer le prénom le plus fréquent.
  6. Trouver les prénoms les plus rares, c'est-à-dire les prénoms qui ne sont qu'avec XXXX comme année. Classer du moins fréquent au plus fréquent.
  7. Afficher le classement des trente prénoms les plus fréquents entre 1961 et 1970. Puis ce classement pour la période 2011-2020.
  8. Comparer de la même manière les trente prénoms les moins fréquents pour la période 1961-1970 et 2011-2020.
  9. Lister les prénoms qui étaient utilisés entre 1961-1970 mais plus du tout en 2011-2020. À l'inverse, quels prénoms étaient absents entre 1961 et 1970 mais présents entre 2011 et 2020.
  10. Compter le nombre de prénoms distincts par période.
  11. Tracer la courbe montrant l'évolution pour un prénom au fil du temps. Généraliser à plusieurs prénoms et à une période quelconque. Par exemple, pour comparer les prénoms STONE, DALIDA, RINGO, SHEILA et MIKA entre 1951 et 2020.
  12. Tracer les courbes des effectifs hommes/femmes en fonction de l'année (ramener chaque effectif à 10,000 naissances).
  13. Compter et visualiser les prénoms de trois lettres.
  14. Quels sont les prénoms les plus courts ? Quels sont les prénoms les plus longs ?
  15. Tracer le nombre de prénoms distincts en fonction de l'année.
  16. Tracer les courbes montrant l'évolution des longueurs des prénoms.
  17. Tracer la courbe de l'évolution de la position d'un prénom dans les classements annuels.
  18. Utiliser les expressions régulières pour comparer l'évolution des variantes orthographiques d'un prénom (par exemple, le prénom Christelle, avec ou sans h, avec un i ou un y, avec un ou deux l, avec ou sans le e final, etc.).

Des exemples de résultats attendus sont visibles sur ce fil Twitter.

[ 12 ] Vocabulaire et vérification orthographique

Préparation du corpus.

  1. Depuis le corpus curriculum vitae, sélectionner uniquement les lignes de texte libre.
  2. Découper ces lignes en mots.

Établissement du vocabulaire.

  1. Compter pour chaque mot son nombre d'occurrences dans le corpus.
  2. Faire apparaître ce vocabulaire, du mot le moins fréquent au mot le plus fréquent.
  3. Utiliser la stop-list et écarter des résultats les mots vides de sens.
  4. Travailler la présentation du classement : page html, nuage de mots, etc.
  5. Voir la possibilité de cartographier le vocabulaire.

Vérification orthographique : nous souhaitons maintenant croiser le vocabulaire utilisé dans le corpus avec notre dictionnaire.

  1. Signaler les mots présents dans les paragraphes du corpus mais absents du dictionnaire.
  2. Indiquer le numéro de la ligne du corpus où le problème a été détecté.
  3. Produire ce compte-rendu d'erreurs probables dans un fichier texte ou html.

[ 13 - traitement de la langue ] Repérage d'entités particulières dans les textes

Depuis un corpus de votre choix, nous cherchons à extraire les noms propres, en explorant plusieurs pistes :

  1. afficher les mots fréquents dans le corpus avec une majuscule, mais absents du dictionnaire lorsque écrits tout en minuscules,
  2. découper le corpus en phrases,
  3. repérer les mots portant une majuscule même lorsqu'ils ne sont pas en début de phrase,
  4. se baser sur TreeTagger pour repérer les noms propres.

Différentes variations peuvent être envisager autour TreeTagger pour lister :

  1. les adjectifs présents dans le corpus,
  2. les adverbes utilisés,
  3. les temps des verbes conjugués.

Nous cherchons maintenant dans le corpus des mots dont on a préalablement établi la liste (par exemple à l'aide des premières questions de cet exercice), cette liste étant stockée dans un fichier texte :

  1. compter, dans le corpus, les occurrences des mots du lexique établi,
  2. à partir de deux listes différentes, établir deux compteurs distincts, les nombres d'occurrences des mots de chaque liste.

Enfin, nous nous intéressons au repérage des dates :

  1. proposer et programmer une stratégie pour trouver les indications de date dans le corpus.

[ 14 - traitement de la langue ] Concordancier

Nous travaillons sur un corpus de plusieurs textes, chaque texte est dans un fichier, tous les fichiers sont dans un même dossier. Voici le cahier des charges de notre concordancier.

  1. Trouver les lignes d'un fichier qui comportent le mot cherché.
  2. Faire apparaître ces lignes en faisant ressortir le mot cible.
  3. S'assurer que l'on a toutes les occurrences en particulier si elles sont sur une même ligne.
  4. Aligner les occurrences trouvées au centre et permettre de visualiser ainsi les contextes gauche et droit.
  5. Limiter le nombre de caractères dans les fenêtres gauche et droite.
  6. Puis compter la taille de ces fenêtres en mots, en prenant garde à ne pas perdre la ponctuation...
  7. La fenêtre doit aussi être limitée par la phrase dans laquelle a été trouvée le mot cherché (nous ne voulons voir apparaître ni la fin de la phrase précédente, ni le début de la phrase suivante).
  8. Faire apparaître le nom de fichier et le numéro de la ligne.
  9. Permettre de rechercher, non plus un mot précis, mais un motif, exprimé comme une expression régulière.
  10. Regrouper les occurrences par formes observées.

Par exemple, un tel concordancier est jugé satisfaisant.

concordancier

D'autres exemples de résultats possibles sont visibles sur ce fil Twitter.

F. Autres exercices

[ 15 ] Une aide pour le scrabble

Pour cet exercice, nous nous intéressons aux jeux de mots qui nécessitent de trouver des anagrammes à partir d'un tirage de lettres : Scrabble, le mot le plus long, Wordox mais aussi mots croisés ou fléchés, etc.

Préparation d'une structure de données adaptée

  1. Lire le fichier des mots français nous servant de dictionnaire.

Pour chaque mot,

  1. remplacer les lettres accentuées par leurs versions non accentuées, normaliser au besoin,
  2. découper le mot en lettres,
  3. classer les lettres par ordre alphabétique,
  4. construire la chaîne de caractères correspondant à ces lettres ordonnées,
  5. associer cette clef au mot d'origine dans un tableau associatif.

Recherche d'anagrammes

  1. Tester sur quelques tirages produits à la main.
  2. S'il n'existe pas d'anagramme utilisant toutes les lettres, considérer des mots plus petits.
  3. Proposer un affichage par taille des mots.

En normalisant, en particulier en enlevant les accents, mais aussi en acceptant de ne pas utiliser toutes les lettres, nous avons pu introduire des doublons dans notre structure de dictionnaire...

  1. Comment éviter ces doublons ?
  2. Comment se souvenir des versions accentuées des mots ?

Tirage et comptage des points au Scrabble

Dans cette partie, nous nous référons aux règles du Scrabble telles que présentées sur la page wikipedia dédiée à ce jeu.

  1. Définir un tableau associatif qui à chacune des 26 lettres non accentuées de l'alphabet associe le nombre de jetons correspondant.
  2. Produire un tableau classique imitant le sac de lettres : nous devons y trouver les lettres de l'alphabet et le nombre d'occurrences de chaque lettre correspond à ce qui a été défini dans le tableau associatif précédent.
  3. Définir un tableau associatif qui à chacune des 26 lettres non accentuées de l'alphabet associe le nombre de points correspondant.
  4. Proposer une fonction perl qui à partir d'un tableau de lettres calcule le nombre de points correspondant à ces lettres.
  5. Proposer une fonction semblable qui cette fois travaille à partir d'un mot vue comme une chaîne de caractères perl.
  6. Simuler le tirage aléatoire de sept jetons dans le sac. De préférence, on s'assurera que le tirage se fait sans remise.
  7. Déterminer quels mots peuvent être écrits avec ces sept lettres choisies au hasard et indiquer le nombre de points associé à chaque mot.
  8. Produire tous les mots possibles (en évitant si possible les doublons) à partir du tirage, classés par nombre de points.

Anagrammes avec joker

  1. Intégrer la possibité de tirer un ou deux jokers.
  2. À nouveau, soigner l'affichage.

Prise en compte du plateau de jeu

Nous souhaitons maintenant prendre en compte, en plus des lettres tirées, d'autres lettres dont on nous indique qu'elles sont disponibles sur le plateau de jeu.

  1. Considérer la possibilité d'avoir une lettre supplémentaire, déjà présente dans un mot du plateau de jeu.
  2. Généraliser à plusieurs lettres et à un motif, afin de « croiser » plusieurs mots du plateau.
  3. Chercher à « voler » un mot complet, en lui ajoutant un lettre au début ou à la fin. Quels mots pouvons-nous construire sur cette lettre ?
  4. Proposer de compléter un mot présent sur le plateau, cette fois en ajoutant au moins deux lettres.
  5. « Coller » un mot du plateau... trouver un mot à partir du tirage qui, une fois accolé à un mot du plateau, engendre des mots valides de deux lettres.
  6. Prendre en compte les cases bonus du plateau de jeu.

Reste à combiner le tout : plateau, jokers, etc.

[ 16 ] Cartographie d'un vocabulaire

  1. Dans chaque section du corpus, compter des cooccurences des mots de la top-list c'est-à-dire déterminer, pour chaque couple de mots, combien de fois ces deux mots apparaissent dans une même section du corpus.
  2. Produire un fichier texte contenant la matrice des cooccurences, les valeurs étant séparées par des points-virgules.
    On n'oubliera pas un première ligne et une première colonne contenant les mots de la top-list.
  3. Vérifier l'ouverture du fichier produit dans un tableur.
  4. Finalement, il s'agit de visualiser les résultats dans le logiciel gephi, en suivant les indications suivantes :
    • cliquer sur « nouveau projet / ouvrir un fichier de graphe », sélectionner le fichier précédemment créé et indiquer « type du graphe : non dirigé »,
    • l'onglet « Laboratoire de données » permet de retrouver notre matrice de cooccurences, pour la suite nous travaillons dans l'onglet « Vue d'ensemble »,
    • dans la colonne de droite, cliquer sur « Exécuter » pour calculer le « Degré pondéré » de chaque nœud,
    • dans le colonne de gauche, régler les tailles des nœuds (icône ) entre 20 et 75, selon le degré pondéré des nœuds, appliquer,
    • choisir force atlas comme méthode de spatialisation avec 100,000 comme force de répulsion et la case ajustement par taille cochée, exécuter puis arrêter,
    • dans la colonne de droite, dans les paramètres « vue générale du réseau », lancer les calculs de la « modularité » avec une valeur de la résolution entre 0.5 et 1 (par exemple 0.6),
    • dans la colonne de gauche, choisir les couleurs de nœuds (icône ) en fonction de la modularity class, appliquer,
    • onglet « Prévisualisation », dans « labels de nœuds », cocher affichage des labels, décocher « taille proportionnelles » et choisir la police Arial gras 48, rafraîchir.
graphe cooccurrences cartographie

[ 17 ] Décryptage d'un texte codé

Nous nous intéressons aux méthodes de codage par substitution (une lettre est systématiquement remplacée par une autre). Avant de commencer, vous pouvez lire la page wikipedia sur ce sujet.

Dans un premier temps, nous souhaitons déchiffrer un texte codé par une technique de substitution mais sans disposer de la clef utilisée. L'objectif est de décoder le texte mystère suivant.

or z f kcgrkcgh fnnggh mg ug rofo onaougugna fqgb cn u eorrofu rgswfny or gafoa y cng fnbognng xfuorrg iwpaghafnag ga mfyoh or fqfoa gag woblg ufoh cng hgwog yg ufrlgcwh r fqfoa wgycoa f rf uohgwg ipcw gqoagw r lcuorofaopn yg hgh yghfhawgh or kcoaaf rf npcqgrrg pwrgfnh rf qorrg yg hgh fogcj ga gafdroa hf ygugcwg yfnh r org yg hcrroqfn iwgh blfwrghapn yfnh rf bfwprong yc hcy bgaag org gha ygh irch honscrogwgh grrg n gha scgwg bpuiphgg kcg yg hfdrg yg ugw ga f gnqowpn awpoh uorrgh yg rpns gn rfwsgcw grrg n f mfufoh irch y cn kcfwa yg uorrg grrg gha hgifwgg yc bpnaongna ifw cng bwokcg f igong qohodrg kco xorawg f awfqgwh cng ufhhg yg wphgfcj ga yg qfhg wgnygt qpch lfdoacgr ygh ipcrgh y gfc rf qgsgafaopn bpuug pn igca rg hciiphgw gha ifcqwg pc ipcw fonho yowg nfong pn n z awpcqg ifh y fwdwgh y cng bgwafong yougnhopn qgwh r gjawguoag pbboygnafrg f r gnywpoa pc h grgqgna rg xpwa upcrawog ga kcgrkcgh uohgwfdrgh dfaohhgh yg dpoh lfdoaggh ignyfna r gag ifw rgh sgnh kco xcogna rgh ipchhogwgh ga rgh xogqwgh yg blfwrghapn pn wgnbpnawg or gha qwfo rg ifruogw nfon hgaosgwg ufoh apcag r org f r gjbgiaopn yg bg ipona pbboygnafr ga y cn ghifbg awohag ga drfnblfawg kco dpwyg rf ugw gha bpcqgwag y gifohhgh dwpchhforrgh yg uzwag pypwoxgwfna ho ghaoug ifw rgh lpwaobcragcwh fnsrfoh r fwdchag z upnag hpcqgna f cng lfcagcw yg kcontg pc qonsa iogyh or z xpwug cn aforroh iwghkcg ouigngawfdrg ga blfwsg r fauphilgwg yg hgh ifwxcuh fc irch iwpxpny yg bg aforroh npn rpon yg r gjawguoag pwognafrg yg r org b gha f yowg yg rf irch grposngg rgswfny h gafoa dfao rco ugug cng igaoag lcaag kc or pbbcifoa kcfny ipcw rf iwguogwg xpoh ga ifw lfhfwy mg xoh hf bpnnfohhfnbg bgaag bpnnfohhfnbg ucwoa dogn qoag gn fuoaog bfw or z fqfoa bgwagh yfnh rg blgw wgbrch yg kcpo gjboagw r onagwga ga r ghaoug mg qoh kc or fqfoa wgbc cng xpwag gycbfaopn lgcwgchgugna hgwqog ifw ygh xfbcragh hiowoacgrrgh igc bpuucngh ufoh kc or gafoa onxgbag yg uohfnalwpiog ga hcmga f yg ufrlgcwgchgh fragwnfaoqgh y gnalpchofhug ga yg ugrfnbprog dogn kc or gca blgt rco dgfcbpci yg roqwgh or h gn hgwqfoa wfwgugna hgh iwonboifcj fuchgugnah bpnhohafogna f blfhhgw ga f igblgw pc f xrfngw hcw rf irfsg ga f awfqgwh rgh uzwagh gn kcgag yg bpkcorrfsgh ga y gblfnaorrpnh gnapuprpsokcgh hf bprrgbaopn fcwfoa ic xfowg gnqog f cn hefuugwyfu yfnh bgh gjbcwhopnh or gafoa pwyonfowgugna fbbpuifsng ifw cn qogcj ngswg npuug mcioagw kco fqfoa gag fxxwfnblo fqfna rgh wgqgwh yg rf xfuorrg ufoh kc pn n fqfoa ic ygboygw no ifw ugnfbgh no ifw iwpughhgh f fdfnypnngw hpn mgcng ufhhf eorr or bpnhoygwfoa bpuug hpn ywpoa yg rg hcoqwg ifwapca or n gha ifh ouiwpdfdrg kcg rgh ifwgnah yg rgswfny mcsgfna kcg bgrco bo fqfoa rf agag cn igc ygwfnsgg hg hpogna fiirokcgh f bpnxowugw mcioagw yfnh hpn pdhaonfaopn yfnh rg dca yg ugaawg cng ghigbg yg sfwyogn ga yg hcwqgorrfna fciwgh yc xcsoaox hpch rf rfaoacyg yg r org yg hcrroqfn rgh loqgwh hpna wfwgugna wospcwgcj ga b gha cn gqgngugna kcfny fc ygbron yg r fnngg rg xgc ygqogna onyohignhfdrg bgignyfna qgwh rg uorogc y pbapdwg or z gca cng mpcwngg y cn xwpoy wgufwkcfdrg mchag fqfna rg bpcblgw yc hprgor mg ug xwfzfoh cn blguon f awfqgwh rgh aforroh qgwh rf lcaag yg upn fuo kcg mg n fqfoh ifh qc ygicoh kcgrkcgh hgufongh mg ygugcwfoh frpwh f blfwrghapn f cng yohafnbg yg ngcx uorrgh yg r org ga rgh xfboroagh ipcw frrgw ga wgqgnow gafogna dogn uponh swfnygh kc fcmpcwy lco gn fwwoqfna f rf lcaag mg xwfiifo hgrpn upn lfdoacyg ga ng wgbgqfna ifh yg wgipnhg mg blgwblfo rf brgx pc mg hfqfoh kc grrg gafoa bfblgg m pcqwoh rf ipwag ga m gnawfo cn dgfc xgc xrfudfoa yfnh rg xpzgw b gafoa cng hcwiwohg ga f bpci hcw cng ygh irch fswgfdrgh mg ug ygdfwwfhhfo yg upn ifrgapa mg awfonfo cn xfcagcor fciwgh ygh dcblgh igaorrfnagh ga m faagnyoh ifaoguugna r fwwoqgg yg ugh lpagh igc fiwgh rf apudgg yg rf ncoa orh fwwoqgwgna ga ug xowgna cn fbbcgor apca f xfoa bpwyofr mcioagw apca gn wofna y cng pwgorrg f r fcawg hg ypnnfoa yc upcqgugna ga iwgifwfoa kcgrkcgh ipcrgh y gfc ipcw rg hpcigw rgswfny gafoa yfnh cng yg hgh bwohgh y gnalpchofhug bfw yg kcgr fcawg npu fiigrgw bgrf or fqfoa awpcqg cn doqfrqg onbpnnc xpwufna cn sgnwg npcqgfc ga uogcj gnbpwg or fqfoa blfhhg ga faawfig fqgb r fhhohafnbg yg mcioagw cn hbfwfdgg kc or bwpzfoa apca f xfoa npcqgfc ga hcw rgkcgr or yghowfoa fqpow upn pionopn rg rgnygufon ufaon

Pour décrypter un texte sans connaître la règle de chiffrement, il est courant d'utiliser la fréquence d'apparition des lettres dans la langue choisie. Nous considérerons qu'en français les lettres se rangent comme suit, de la plus fréquente à la moins fréquente :

   e a i t s n l u r o d m c p v q h f b g j x y z w k
  1. Définir une variable perl contenant le texte crypté fourni ci-dessus et une autre variable contenant le tableau des lettres de l'alphabet par ordre de fréquence dans la langue française.
  2. Proposer un code perl qui construit un tableau associatif faisant correspondre chaque lettre apparaissant dans la phrase mystère à son nombre d'occurrences dans cette même phrase.
  3. Ordonner les clefs du tableau associatif obtenu par valeurs décroissantes, autrement dit obtenir la liste des lettres présentes dans le texte mystère classées par nombre d'occurrences décroissant.
  4. Construire un tableau associatif dont les clefs correspondent au tableau obtenu à la question précédente et dont les valeurs correspondent au tableau des lettres de l'alphabet classées par fréquences décroissantes dans la langue française (la correspondance se fait position par position dans les deux tableaux).
  5. Utiliser ce tableau pour finalement décrypter la phrase mystère.

Dans un second temps, nous pouvons généraliser le travail accompli et nous donner en Perl les moyens de coder et décoder un texte.

  1. Définir un tableau associatif mettant en correspondance chaque lettre de l'alphabet avec une autre lettre.
  2. De la même manière, définir un tableau associatif définissant le codage ROT13 dans lequel une lettre et sa remplaçante sont à une distance de 13 dans l'alphabet (le a est mis en correspondance avec le n, le b avec le o, etc.).
  3. Écrire la fonction chiffrement_lettre($l,%t) qui renvoie la correspondance de la lettre $l dans le tableau associatif %t si cette correspondance existe, et renvoie la lettre $l elle-même sinon.
    Tester à l'aide des tableaux précédemment définis.
  4. Écrire la fonction chiffrement_phrase($p,%t) qui construit une chaîne de caractères correspondant au chiffrement caractère par caractère de la phrase $p à l'aide du tableau associatif %t.
    Tester en codant une phrase quelconque, à l'aide des tableaux précédemment définis.
    Comment décoder le résultat obtenu ?
  5. Proposer une fonction inverse_code(%t) qui renvoie un tableau associatif, lequel reprend les clefs et les valeurs du tableau associatif %t mais en les inversant.
    Tester en déchiffrant les phrases précédemment codées.

[ 18 ] Écriture intuitive avec un pavé numérique

  1. Définir à l'aide d'un tableau associatif perl la correspondance entre les lettres de l'alphabet et les touches du clavier (par exemple on associera la valeur 2 à chacune des lettres a, à, â, ä, b, c et ç).
  2. Lire le fichier des mots français nous servant de dictionnaire et associer chaque mot et sa version numérique (par exemple 268268 => coucou).
  3. Proposer une interprétation de la phrase suivante, le chiffre 0 délimitant les mots :
        2682680266636802208202436053702672467066032480330520
        77647266284660283203370822532890277624284370876702665
    

Fabien Torre Valid HTML5! Valid CSS!
Accueil > Enseignement > En pratique > Programmation > Perl
(contenu mis à jour )
site de Fabien Torre, université de Lille

Description

Survoler un lien de navigation pour lire sa description ici...