• # Autre approche : grep

    Posté par (site web personnel) . En réponse au journal sur le fonctionnement du jeu Wordle. Évalué à 9. Dernière modification le 13 janvier 2022 à 14:29.

    Note : je me base sur la liste des mots présents dans le dictionnaire américain de Debian, accessible via le paquet wamerican et listé dans le fichier /usr/share/dict/american-english

    Il est également possible de choisir ses mots en fonction de la quantité d’information contenus dans chacun d’eux. Par exemple, le dictionnaire anglais contient 102.774 entrées :

    $ wc -l american-english 
    102774 american-english

    et l’on se rend compte que le a est présent dans 52% d’entre eux :

    $ grep -i "a" american-english | wc -l
    53715

    Si l’on choisi un mot avec un a, sans meme savoir quel sera le résultat, nous éliminons la moitié des mots possibles. Comme nous avons 5 lettres possibles, autant choisir celles qui permettent de discréminer un max de résultat. Et c’est parti pour une plongée en bash pour trouver la solution !

    $ grep -o . <<< "abcdefghijklmnopqrstuvwxyz"| while read letter; do echo $letter $(grep -i $letter american-english | wc -l); done
    a 53715
    ...
    e 65692
    ...
    n 47826
    ...
    r 50018
    ...
    t 44232
    $ grep "^.....$" american-english | grep -i "a" | grep -i "r" | grep -i "n" | grep -i "t"
    Brant
    Grant
    Rutan
    Trina
    grant
    rants
    train

    essayons train avec le mot du jour : le a est reconnu, mais pas les autres lettres ! Parfait, il ne reste que 878 mots présents :

    $ grep "^.....$" american-english | grep -i "a" | grep -iv "[trin]" > /tmp/iter1
    $ wc -l /tmp/iter1
    878

    On recommence notre itération :

    $ grep -o . <<< "abcdefghijklmnopqrstuvwxyz"| while read letter; do echo $letter $(grep -i $letter /tmp/iter1 | wc -l); done
    b 124
    c 169
    d 181
    e 370
    h 135
    l 342
    m 175
    o 137
    p 139
    s 504
    y 139
    $ grep "^.....$" american-english | grep -i "s" | grep -i "l" | grep -i "e" | grep -i "d" | grep -i "m"
    melds

    31 mots restants ! On s’approche !

    $ grep "^.....$" /tmp/iter1 | grep -i "a" | grep -i "e" | grep -iv "[trinmlds]" > /tmp/iter2
    $ wc -l /tmp/iter2
    31 /tmp/iter2
    $ grep -o . <<< "abcdefghijklmnopqrstuvwxyz"| while read letter; do echo $letter $(grep -i $letter /tmp/iter2 | wc -l); done
    b 6
    c 11
    f 2
    g 8
    h 9
    k 5
    o 2
    p 9
    q 2
    u 8
    v 6
    w 3
    x 1
    y 4
    z 1
    $ grep "^.....$" /tmp/iter2 | grep -i "c" | grep -i "h" | grep -i "p"
    cheap
    peach

    Prenons-en un des deux, et faisant notre test : plus que 14 possibilité, et il reste 3 coups !

    $ grep "^.....$" /tmp/iter1 | grep -i "a" | grep -i "e" | grep -iv "[trinmldspch]" > /tmp/iter3
    $ wc -l /tmp/iter3
    14 /tmp/iter3
    $ grep -o . <<< "abcdefghijklmnopqrstuvwxyz"| while read letter; do echo $letter $(grep -i $letter /tmp/iter3 | wc -l); done | grep -v [01]
    b 4
    g 5
    k 4
    o 2
    q 2
    u 6
    v 4
    w 3
    $ grep "^.....$" /tmp/iter3 | grep -i "u" 
    ...
    quake

    Plus que 5 mots dans la liste, et encore deux coup restants ! Je pense qu’on est bon !

    $ grep "^.....$" /tmp/iter3 | grep -i "a" | grep -i "e" | grep -iv "[trinmldspchquk]"
    abbey
    above
    agave
    gaffe
    weave

    En fait, si l’on tient compte des informations sur le placement des lettres, on sait à ce moment là que le e n’est pas en dernière position, et il ne reste plus qu’une seule possibilité.

    Y a-t-il un volontaire pour mettre tout ça dans un petit scritp interractif qui s’occupe de nous trouver la solution ? :)