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

Lua Discussion :

TRI pour le mot le plus long


Sujet :

Lua

  1. #1
    Invité
    Invité(e)
    Par défaut TRI pour le mot le plus long
    Bonjour,

    j'ai réalisé un petit prog lua pour le classic jeu du mot le plus long.

    Tirage de 9 lettres aléatoirement à partir d'un fichier voyelle et d'un fichier consonne
    Recherche de résultats possibles ( de 9 lettres à 2 lettres ) dans un fichier dictionnaire.

    Avant de faire le tri, tous les mots du dictionnaire sont stockés dans un tableau puis les lettres de chaque mot sont classées par ordre alphabétique. La même chose est réalisée avec les lettres tirées aléatoirement.
    Ensuite comparaison des lettres tirées au sort et triées alphabétiquement avec les mots du tableau de dico triés alphabétiquement

    quand il y a correspondance, l'index du tableau dico correspondra à la ligne du nom dans le fichier dico.

    Mon souci est que toutes les solutions ne sont pas trouvées à chaque fois : après vérification dans le fichier dictionnaire.

    Mon tri est il correct ?
    Le problème peut il venir du fichier dico : ce fichier est simplement le fichier de debian dans
    pour lequel j'ai passé plusieurs commandes sed
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sed '/-/d' fichier.txt > fichier_sortie.tx
    sed '/,/d' fichier.txt > fichier_sortie.tx
    sed 'y/àâéèêëîïôöùûüç/aaeeeeiioouuuc/' fichier.txt > fichier_sortie.txt
    ci-joint mon prog au format zip avec le fichier dico trié
    Pièce jointe 520011

    quelqu'un aurait une idée peut être ?

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    J'ai testé ton script, et c'est vraiment très lent, c'est normal au vu du nombre d'opérations de tris à faire sur pratiquement 340 000 mots.
    Il n'est donc pas envisageable de persévérer ainsi. Je n'ai donc pas regardé ce qui clochait dans ton script.

    Mais pour déboguer, as-tu testé si tu détectes bien tous les mots avec des prints ? Histoire de bien vérifier que ce n'est pas à l'insertion des mots dans les tables que ça déconne (écrasement de valeurs) plutôt qu'aux détections dans le fichier.

    Je te propose une meilleure solution et sans besoin de trier, pas sûr que ce soit bien optimal, l'unique fois où j'ai fait du lua, c'était pour le modding d'un jeu, et ça fait pas mal de temps.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    function string.to_list(s)
        -- Convertit une chaîne en table
        list = {}
        for i = 1, #s do
            list[i] = s:sub(i, i)
        end
        return list
    end
     
     
    function table.find(tab, element)
        -- Retourne la position d'un élément dans
        -- la table ou nil si non trouvé
        for i, n in ipairs(tab) do
            if n == element then
                return i
            end
        end
        return nil
    end
     
     
    local function nombre_concordances(mot, lettres)
        -- Retourne le nombre de concordances entre le mot et lettres
        liste_lettres = string.to_list(lettres)
        nc = 0
        for i = 1, string.len(mot) do
            car = string.sub(mot, i, i)
            pos = table.find(liste_lettres, car)
            if pos ~= nil then
                table.remove(liste_lettres, pos)
                nc = nc + 1
            end
        end
        return nc
    end
     
     
    local function resultats(fichier, lettres)
        -- Construit et retourne un array avec pour clef la longueur des
        -- mots et valeur une table des mots
        len_lettres = string.len(lettres)
        occurences = {}
        for mot in io.lines(fichier) do
            len_mot = string.len(mot)
            if len_mot < 2 or len_mot > len_lettres then
                goto continue
            end
            nc = nombre_concordances(mot, lettres)
            if nc ~= len_mot then
                goto continue
            end
            tab_mot = occurences[nc]
            if tab_mot == nil then
                tab_mot = {}
                occurences[nc] = tab_mot
            end
            table.insert(tab_mot, mot)
            ::continue::
        end
        return occurences
    end
     
     
    local function afficher_resultats(fichier, lettres)
        res = resultats(fichier, lettres)
        len_max = 0
        for i, _ in pairs(res) do
            if i > len_max then
                len_max = i
            end
        end
     
        for _, mot in pairs(res[len_max]) do
            print(mot)
        end
    end
     
    afficher_resultats("french", "vlrftioya")
    Le temps ronge l'amour comme l'acide.

  3. #3
    Invité
    Invité(e)
    Par défaut
    bonjour,

    oui j'ai testé avec des "print" et compté le nombre de mot. Tous les mots sont bien entrés dans le tableau de tri ! je ne comprends pas pourquoi cela ne trouve pas toujours les mots !

    je vais testé ton script, merci

    a bientôt

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour bistouille

    Effectivement ton code est bien plus rapide , merci beaucoup, j'ai pu modifier mon code et supprimer ce tri qui faisait perdre beaucoup de temps

    merci beaucoup de ton aide.



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

Discussions similaires

  1. Le mot le plus long
    Par bernedef dans le forum Langage
    Réponses: 12
    Dernier message: 25/05/2010, 13h27
  2. Rechercher mot le plus long d'une chaine de caractère
    Par fafabzh6 dans le forum VBA Access
    Réponses: 5
    Dernier message: 14/10/2009, 17h15
  3. [RegEx] Conserver le mot le plus long
    Par Zoldik dans le forum Langage
    Réponses: 4
    Dernier message: 18/03/2009, 12h14
  4. Affichage du mot le plus long
    Par winzilla dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 13/11/2008, 23h25
  5. Trouver le mot le plus long dans une chaîne
    Par bassoum dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 02/11/2008, 10h45

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