IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Algorithme pour changer les lettres d'un mot donné


Sujet :

Algorithmes et structures de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    artiste
    Inscrit en
    Janvier 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : artiste

    Informations forums :
    Inscription : Janvier 2019
    Messages : 5
    Points : 15
    Points
    15
    Par défaut Algorithme pour changer les lettres d'un mot donné
    Bonjour

    Je n'ai absolument aucune connaissances en maths, algo, programmation mais peut-être quelqu'un pourra-t-il s'amuser avec cet exercice et me donner un coup de main...
    Je prépare un projet artistique. Mon travail actuel joue avec les mots et la typographie.

    Je pars d'un mot de départ. Par exemple "art"
    le "a" peut être remplacé par les 2 lettres suivantes: "a" (lui-même) ou "h"
    le "r" peut être remplacé par les 5 lettres suivantes: "r" (lui-même), "i", "n", "t", ou "w"
    le "t" peut être remplacé par les 4 lettres suivantes: "t" (lui-même), "a", "e" ou "z"

    Si je me rappelle bien de mes cours de secondaire, il en résulte 40 (2x5x4) possibilités de mots différents.
    La plupart ne veulent rien dire mais quelques uns ont un sens.
    C'est le cas pour "ara", "aïe", "ane" ou "hit".
    Ce sont ces mots qui m'intéressent.

    J'aimerais refaire ce jeu avec n'importe quel mot de mon choix.
    Avec un mot de 3 lettres comme dans mon exemple, je peux faire ça à la main, c'est pas trop long.
    Mais avec des mots plus longs, ça devient tout de suite plus compliqué.

    En résumé:
    -Chaque lettre de l'alphabet peut être remplacée par x lettres (dont elle-même) que je détermine au départ.
    -je donne un mot de mon choix
    -une liste de mots est générée (chaque lettre garde sa position initiale)
    -La liste générée est comparée à une liste type dictionnaire.
    Au final, j'obtiens une liste de mots qui ont du sens et que j'utiliserai dans mes créations.


    Merci, si ce n'est pour votre aide, au moins d'avoir parcouru ma bafouille jusqu'à la fin

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Soit un fichier conversion.txt qui indique les transformations comme ceci:
    Soit ce script bash utilisable dans une console Linux classique :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
     
    mot=$1
     
    m=$(sed 's/./& /g;s/ $//' <<<$mot)
    motif=$(echo "$m" | awk '(FNR==NR){a[$1]=$2;next} {printf("^");for (i=1;i<=NF;i++) if (a[$i]!="") printf("[%s]",a[$i]); else printf("[%s]",$i); printf("$\n");}' conversion.txt - )
     
    if ! grep -i "$motif" dictionnaire.txt
    then
            echo "Aucun mot ne sied."
    fi

    On obtient alors les résultats suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $ ./art_converter.bash art
    AIE
    AIT
    ANA
    ANE
    ARA
    ARE
    ART
    HIA
    HIE
    HIT
    $ ./art_converter.bash aaa
    Aucun mot ne sied.
    $ ./art_converter.bash arg
    Aucun mot ne sied.
    $ ./art_converter.bash grt
    GIT
    GRE
    Bonne chance
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre à l'essai
    Homme Profil pro
    artiste
    Inscrit en
    Janvier 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : artiste

    Informations forums :
    Inscription : Janvier 2019
    Messages : 5
    Points : 15
    Points
    15
    Par défaut algorithme pour changer les lettres d'un mot donné?
    Pour commencer merci pour l'aide!
    mais comme je disais dans ma question initiale, je suis un nullos.

    Ok, la première fenêtre de code...
    j'ai créé un document "conversion.txt"
    Je mets les lettres de l'alphabet du mot qui m'interesse avec leurs correspondances.
    J'ai enregistré et je l'ai rangé dans un fichier intitulé "motsdoubles" sur mon bureau.

    Pour la deuxième fenêtre, je suis sur mac, j'ai ouvert le terminal et copié collé le script bash.
    J'actionne la touche retour et ça me donne:

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    MacBook-Pro-de-MD:~ md$ #!/bin/bash
    MacBook-Pro-de-MD:~ md$ 
    MacBook-Pro-de-MD:~ md$ mot=$1
    MacBook-Pro-de-MD:~ md$ 
    MacBook-Pro-de-MD:~ md$ m=$(sed 's/./& /g;s/ $//' <<<$mot)
    MacBook-Pro-de-MD:~ md$ motif=$(echo "$m" | awk '(FNR==NR){a[$1]=$2;next} {printf("^");for (i=1;i<=NF;i++) if (a[$i]!="") printf("[%s]",a[$i]); else printf("[%s]",$i); printf("$\n");}' conversion.txt - )
    awk: can t open file conversion.txt
     source line number 1
    MacBook-Pro-de-MD:~ md$ 
    MacBook-Pro-de-MD:~ md$ if ! grep -i "$motif" dictionnaire.txt
    > then
    >         echo "Aucun mot ne sied."
    > fi
    grep: dictionnaire.txt: No such file or directory
    Aucun mot ne sied.
    MacBook-Pro-de-MD:~ md$

    Si je comprend bien, il ne trouve pas le document "conversion.txt"
    Comment lui indiquer le chemin?

    Il ne trouve pas non plus le document "dictionnaire.txt".
    Normal, je ne l'ai pas crée.
    mais où dois-je ranger ce fichier et comment je lui indique le chemin?

    Bonne soirée à tous les experts!

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Tu as ouvert un Mac terminal ? Super !
    Partons de là. Ça va marcher.

    j'ai créé un document "conversion.txt"
    Je mets les lettres de l'alphabet du mot qui m'interesse avec leurs correspondances.
    J'ai enregistré et je l'ai rangé dans un fichier intitulé "motsdoubles" sur mon bureau.
    Il faut savoir. Tu veux l'appeler "motsdoubles" ou "conversion.txt" ?
    Fais ton choix et tiens-le.
    Dans le script, tu écriras la version que tu choisis.

    mais où dois-je ranger ce fichier et comment je lui indique le chemin?
    Tu le ranges où tu veux.
    L'idéal serait de tout mettre dans un dossier dédié.
    Se repérer dans ton arborescence de fichiers est important. Même pour d'autres utilisations.
    Dans ton terminal, pour savoir où tu es, tape :
    Pour savoir quels fichiers et dossiers sont là, tape :
    Dans un chemin, les répertoires sont séparés par une oblique (slash "/" en anglais).
    /repertoire1/repertoire2/monfichier.txt veut dire "le fichier appelé monfichier dans le dossier répertoire2, lui-même dans le dossier répertoire1.
    Pour entrer dans un dossier, tape :
    Pour sortir, tape :
    Pour créer un dossier nommé "mondossier", tape :
    Tu devrais te trouver un tutoriel sur internet pour les premiers pas.

    Le texte que tu as mis dans la console, tu vas plutôt l'enregistrer dans un fichier texte appelé "art_converter.bash".
    C'est ma faute, j'ai été vite en besogne dans mes explications
    Tu pourras le faire fonctionner en tapant dans la console (cette fois-ci), si tout est dans le bon dossier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bash art_converter.bash art


    On résume. Dans l'idéal, tu crées un dossier dans lequel tu mets :
    • art_converter.bash
    • dictionnaire.txt (un fichier avec un mot par ligne, non fourni )
    • conversion.txt ou motsdoubles

    Pas besoin de la console jusqu'ici. Si tu es plus à l'aise avec les fenêtres.
    Puis tu vas dans le bon dossier avec la console, cette fois-ci (avec cd et pwd pour vérifier)
    Et tu t'éclates.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Membre à l'essai
    Homme Profil pro
    artiste
    Inscrit en
    Janvier 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : artiste

    Informations forums :
    Inscription : Janvier 2019
    Messages : 5
    Points : 15
    Points
    15
    Par défaut hum hum
    Bon, ça me déprime de pas y arriver malgré tes explications tellement claires.
    Je suis aussi aller voir des tutoriels sur internet, j'ai eu l'impression de comprendre un peu...
    mais non.

    Je résume ce que j'ai fait:

    J'ai créé un dossier "motsdoubles" dans mon dossier perso /Users/md
    (j'avais écrit "fichier" mais c'était un lapsus dans mon précédent post)

    Dedans, j'y ai rangé 3 fichiers:

    - art_converter.bash (avec le script que tu m'as donné)

    - dictionnaire.txt (avec un mot par ligne)
    abaissé
    abaissement
    abaisser
    abandon
    abandonnant
    ...
    zygote


    - conversion.txt (contenant l'aphabet avec les correspondances)
    a ah
    b bk
    c cadgkopqrsx
    d dabfkprst
    e eabfgkopqrtx
    ...
    z zbekr

    J'ouvre le terminal.
    je fais pwd pour savoir ou je suis.
    Je suis dans /Users/md
    Je tape cd motsdoubles dans le terminal
    je refais pwd
    Je suis bien dans le dossier /Users/md/motsdoubles
    Je tape la commande "bash art_converter.bash art" dans le terminal
    Il me répond "aucun mot ne sied"

    Quelle erreur est-ce que je fais?
    ça m'enneeeeerve!

    J'imagine que ça a avoir avec le mot que je veux transformer.
    Si par exemple, je veux jouer avec le mot "nul" (ouais comme moi)
    j'ai essayé de taper la commande "bash art_converter.bash nul"
    Il me répond encore "aucun mot ne sied"

    Pfff...
    J'ai encore besoin qu'on me prenne la main!

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Les bonnes nouvelles sont que :
    • Tout est en place
    • Le code s'exécute.
    La mauvaise nouvelle est que rien ne sort.

    2 choses à dire :
    • Sous Mac, Windows ou Linux, les fichiers texte ne "codent" pas la fin de ligne de la même façon. (Respectivement "\r", "\r\n", "\n")
      Ce sont des caractères invisibles présent dans le fichier.

      Tu devrais changer cette ligne
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      motif=$(echo "$m" | awk '(FNR==NR){a[$1]=$2;next} {printf("^");for (i=1;i<=NF;i++) if (a[$i]!="") printf("[%s]",a[$i]); else printf("[%s]",$i); printf("$\n");}' conversion.txt - )
      par celle-ci:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      motif=$(echo "$m" | awk '(FNR==NR){a[$1]=$2;next} {printf("^");for (i=1;i<=NF;i++) if (a[$i]!="") printf("[%s]",a[$i]); else printf("[%s]",$i); printf("\\r$\n");}' conversion.txt - )
    • Le dictionnaire contient des accents. Mais "é" "e" "E" "É" sont 4 caractères différents. (entre autres ... äàçéèêëïöüù)
      Le conseil est de remplacer les lettres accentués par leur équivalent simple, dans le dictionnaire : "é" -> "e"
      Sinon, il ne verra pas de correspondance.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Membre à l'essai
    Homme Profil pro
    artiste
    Inscrit en
    Janvier 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : artiste

    Informations forums :
    Inscription : Janvier 2019
    Messages : 5
    Points : 15
    Points
    15
    Par défaut ouaiiiis
    ça maaaaaaaarche!

    Maintenant je ne me sens plus nul du tout grâce à toi!

    Est-ce que je peux abuser de ton savoir et de ta patience?
    Si tu n'as pas envie ou simplement pas le temps, pas de problème, je clos le sujet, c'est déjà plus que je n'espérais.

    Je reprend l'exemple du mot "art"
    avec le script que tu m'as fourni, il va chercher les occurences dans les mots de 3 lettres uniquement.
    Serait-il possible de faire la même chose pour des mots plus longs?
    Cad au final avoir une liste avec tous les mots contenant la suite de lettres "art" et ses correspondances?

    Comme dit, pas de problème si tu m'envoies bouler...
    Nom : bash.jpg
Affichages : 1059
Taille : 134,7 Ko

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Merci.
    J'adore ton dessin !

    Si un message t'as aidé, clique sur son pouce vert.

    avec le script que tu m'as fourni, il va chercher les occurrences dans les mots de 3 lettres uniquement.
    Serait-il possible de faire la même chose pour des mots plus longs?
    Précisément, il va chercher les mots de la longueur du mot initial.
    Mais si tu mets plus long, ou si tu mets des lettres absentes de conversion.txt, il marchera quand même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ art_converter.bash tartre
    TARARE
    TARTRE
    TATANE
    TATARE
    THRENE
    Note que le "e" de fin est immuable. Les autres lettres suivent le fichier de conversion.



    Explication rapide du code :
    • On récupère le mot passé en paramètre. art par exemple.
    • On le transforme en suite de lettres séparés par des espaces pour le script awk. a r t, ici.
    • Le script awk crée une expression rationnelle ^[ah][rintw][taez]$, ici.
    • On filtre le dictionnaire avec l'expression rationnelle. (grep)
    • Si le filtre ne renvoie rien, on remplace l'immonde message d'erreur par une phrase en bon français. if ...; then ... ; fi



    Les expressions rationnelles = les expressions régulières = regular expressions = regex.
    Elles servent de squelette pour désigner toute une famille de chaîne de caractères.
    art -> un mot composé avec "art"
    ^ -> début de ligne
    $ -> fin de ligne
    [ ] -> ensemble de caractères possibles.
    [art] -> soit la lettre "a", soit "r", soit "t". (Mais 1 seul des trois)
    .* -> n'importe quel caractère en quantité indéfinie ( 0 ou + )
    ^ar.*t$ -> une ligne commençant par ar et finissant par t quelque soit le milieu.
    [art]* -> a r ou t en quantité indéfinie (ex "" "art" "taratata")
    etc.
    Pareil : de nombreux tutos regex sur internet.




    Ici, c'est tout ce que fait le script : créer une regex et filtrer le dictionnaire.
    Donc si tu veux élargir ton champ des possibles, modifie la regex.
    Tu as déjà modifié la regex pour ajouter \r en fin de ligne.

    Apparemment, ceci devrait faire ce que tu veux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    motif=$(echo "$m" | awk '(FNR==NR){a[$1]=$2;next} {printf("");for (i=1;i<=NF;i++) if (a[$i]!="") printf("[%s]",a[$i]); else printf("[%s]",$i); printf("\n");}' conversion.txt - )
    Note: le premier printf écrit ce qu'il y a avant ton motif, le deuxième printf écrit le motif à partir du fichier conversion.txt, le troisième printf écrit la fin de l'expression régulière.

    Bonne chance !
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Membre à l'essai
    Homme Profil pro
    artiste
    Inscrit en
    Janvier 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : artiste

    Informations forums :
    Inscription : Janvier 2019
    Messages : 5
    Points : 15
    Points
    15
    Par défaut chapeau
    Salut Flodelarab!
    Et bien, il ne me reste qu'à ôter mon chapeau et te remercier.
    Pour l'instant, je n'ai plus rien à demander.
    C'est la première fois que je viens sur ce site et je dois dire que je suis enthousiaste par la clarté, la rapidité et la gentillesse de tes réponses.

    Si tu as un dessin personnalisé à me demander, pour ta copine, un pote, ou quelqu'un de ta famille...
    je le ferais volontiers (un peu dans le genre de celui du post précédent)
    ciao ciao

    Youk

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ecarter les lettres d'un mot pour qu'il prenne une certaine taille
    Par Kaluza dans le forum Programmation (La)TeX avancée
    Réponses: 3
    Dernier message: 05/04/2014, 10h23
  2. logiciel pour changer les mots de passe office
    Par matsch77 dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 10/01/2010, 14h03
  3. problème d'algorithme pour trouver les circuit d'un graphe
    Par marc_dd dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 21/08/2006, 16h36
  4. algorithme pour enlever les occurences d'une liste
    Par bendenice dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 08/02/2006, 23h28
  5. Problème pour changer les cartes d'un CardLayout
    Par vallica dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 29/11/2005, 14h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo