Chaussettes et Batraciens

Imaginez la situation suivante : vous disposez d'une liste de mots dans un fichier LIST. Vous disposez également d'un dictionnaire dans un fichier DICT. Et vous voulez savoir si tous les mots de LIST apparaissent bien dans DICT.

C'est un problème fréquent en informatique. LIST contient par exemple tous les batraciens et DICT contient tous les animaux. Demander si LIST est incluse dans DICT revient à demander si tous les batraciens sont des animaux.

Dans ce billet je montre deux méthodes en ligne de commande. La première méthode n'est pas efficace mais elle est compacte et facile à mémoriser. La seconde méthode est beaucoup plus efficace.


Méthode 1: grep me, grep me my friend


La première méthode utilise grep(*) dans sa variante fgrep qui cherche les termes littéraux plutôt que les regex. Voici la ligne de commande :

fgrep -vxf DICT LIST

Il faut un peu de temps - et sans doute quelques essais - pour se convaincre que ça réalise bien un test d'inclusion. Cette commande prend tous les mots de DICT et les retranche de LIST. Si au moins un mot est affiché c'est qu'il n'a pas été retranché. Donc il n'était pas dans DICT. Donc LIST n'est pas incluse dans DICT.

Cette solution est très compacte : une seule commande. En revanche la complexité est multiplicative. Je vous passe les détails de calcul, mais c'est mauvais.


Méthode 2: tri et décompte


L'idée est d'amalgamer DICT + DICT + LIST et de conserver seulement les termes uniques. Trois cas sont possibles. Cas 1 : un terme est dans DICT et dans LIST alors il se retrouve trois fois dans l'amalgame et on ne le conserve pas. Cas 2 : un terme est dans DICT mais pas dans LIST alors il se retrouve deux fois dans l'amalgame et on ne le conserve pas. Cas 3 : un terme est dans LIST mais pas dans DICT alors il se retrouve une fois dans l'amalgame et on le conserve. Voici la ligne de commande :

sort <(sed p DICT) <(sort -u LIST) | uniq -u

Il y a des petites astuces. Le sed p DICT c'est pour dupliquer chaque ligne de DICT. Le sort -u LIST c'est pour éliminer d'éventuels doublons dans LIST (qui sinon fausseraient le cas 3). Le uniq -u à la fin c'est pour conserver seulement les termes uniques.

Concernant la complexité : dupliquer les lignes de DICT c'est linéaire, amalgamer c'est linéaire, compter et garder seulement les termes uniques à la fin c'est linéaire. La seule partie non-linéaire c'est le tri de l'amalgame. Cette partie est quasi-linéaire c'est-à-dire en (2m+n).log(2m+n). En pratique c'est bien, même s'il existe encore mieux avec des tables de hachage.


Exemple : un dictionnaire d'animaux, une liste de batraciens et une chaussette

$ cat DICT | column
girafe          singe           serpent
crapaud         panthère        kangourou
éléphant        crocodile       anaconda
zèbre           triton          gnou
grenouille      autruche        mangouste
lion            hippopotame     ornithorynque
tigre           salamandre      gazelle
$ cat LIST 
triton
crapaud
chaussette 
salamandre
grenouille
fgrep -vxf DICT LIST
chaussette
$ sort <(sed p DICT) <(sort -u LIST) | uniq -u
chaussette

Les deux commandes ont correctement détecté l'intrus. Un seul intrus suffit à déduire que LIST n'est pas incluse dans DICT. Si maintenant on enlève la chaussette de la liste, les deux commandes ne détectent plus rien, leur sortie est vide, et on en déduit que LIST est incluse dans DICT :

fgrep -vxf DICT LIST
$ sort <(sed p DICT) <(sort -u LIST) | uniq -u 


Test booléen


Pour transformer la première commande en un pur test booléen, j'utilise l'option quiet de fgrep et des portes logiques && et ||. C'est une façon de faire parmi d'autres mais j'aime le côté one-liner(**) :

    fgrep -vxqf DICT LIST && echo KO || echo OK

Pour la seconde commande, uniq n'offre pas d'option quiet, alors j'utilise une vielle ruse indienne :

    sort <(sed p DICT) <(sort -u LIST) | uniq -u |
    read _ && echo KO || echo OK


Epilogue

J'espère que ce billet vous aura intéressé. Parce que sinon vous venez de perdre un temps précieux à le lire jusqu'ici. Moche. Nan, vraiment. Moche.

Au fait, si on n'est pas joueur/bricoleur on peut aussi utiliser la merveilleuse commande "comm" qui est typiquement faite pour les comparaisons de liste.

comm -13 <(sort -u DICT) <(sort -u LIST) | read _ && echo KO || echo OK

La complexité est meilleure m.log(m) + n.log(n) quoique toujours quasi-linéaire, et c'est assez compact.


(*) Les personnes qui me connaissent savent que je suis obsessionnel de grep et plus généralement des regex. Je me lève grep, me mange des grep au sarrasin, je me couche grep et je recommence le lendemain. Quant aux personnes qui ne me connaissent pas, elles ignorent la chance qu'elles ont.

(**) Quel est le terme français correct pour one-liner ? "Un-lignard" ? Ou "Solicode" "Solocode" "Monocode" ? Un "codounet" une "Codette" ? Pfffff....

ALCEST - Améthyste

Je retombe sur cette vidéo d'Alcest. Le morceau Améthyste mis en avant sur leur dernière tournée. 

D'habitude je n'apprécie pas trop les vidéos concert/live. Mais là je retrouve *précisément* l'ambiance du concert, ce moment précieux que j'ai pu vivre sur place.

Tout y est : salle à taille humaine, proximité, public inspiré, décor émouvant, et Alcest au sommet de son art.




Alohomora Sésame Mellon

  

Aux fins-fonds du cyberespace
Les mots-clé font, ça m'agace
De fort mauvais mots de passe


Aqua penses-tu ?

L'eau c'est bien H2O ? Pas du tout, c'est E.A.U.

Bon, j'en suis à 15 mois sans rien boire. Enfin, rien de plus fort que de la Brooklyn sans alcool à 0,4°. Et 0,4° j'aime mieux vous dire que ça prend un temps dingue pour être torché !

Côté thunes c'est difficile à calculer précisément, mais j'estime environ 300 balles d'économies sur l'ensemble de la période. Somme que j'ai intégralement reversé à une petite association d'utilité publique dans mon quartier : trois quatres mecs cagoulés avec des pitbulls dans le hall de l'immeuble. Enfin je n'ai pas vraiment reversé l'argent, c'est plutôt eux qui m'ont tout pris direct. C'est bizarre l'associatif ces temps-ci.

Bref, je suis super heureux de ne pas picoler (sauf au HellFest évidemment).

Étain la lumière


"L'étain passe,
les soudures"


Le premier job de mon père c'était soudeur à l'étain. Il soudait des boîtiers électroniques étanches. Parfois il ramenait du travail à la maison, il me montrait. Je me souviens : la magie du métal qui fond, le grésillement, l'odeur toxique du fil d'étain.

Choc de terminaison

Nous avons eu
Le Black Friday,
La Black Friday Week,
Maintenant le Black November.

Et demain, quoi ?
Black Year
Black Decade
Ou Blackout ?

Right through the cracks

Hangar désaffecté à Redon.

"What if you could look right through the cracks?

Would you find yourself, find yourself afraid to see?"

-- Nine Inch Nails, Right Where It Belongs.


 

TOP 10 sur Regex Crossword

À tous les coups il n'y a que moi que ça intéresse (*) mais ça y est : je suis dans le TOP 10 sur Regex Crossword.

Plus précisément c'est 10e sur 92600. Pas certain que je puisse un jour améliorer ce score... ou alors il faudrait que je me mette à réfléchir, mais flemme.

En tout cas n'hésitez pas à essayer, c'est vraiment *LE* moyen sympa et ludeek d'apprendre les RegEx pour de bon.


(*) Et encore...

www.metallurgeek.fr

Cher lectorat (de bibliothèque), vous savez à quel point je vous aime, en gros comme au détail. Alors pour vous faciliter l'accès massif à mon ineffable et néanmoins désopilant blog, je me suis carrément acheté le domaine metallurgeek.fr.

Bon en fait c’est surtout qu’il y avait une promo chez OVH alors j’en ai profité. Ça me coute juste quatre fois ce que le blog m’a rapporté en pub. J’y suis de ma poche donc, bâtard d’économie digitale de ses morts ! Après ça reste des petites sommes quand même, j'te parle pas non plus de faire tomber de la grosse caillasse là.

Prochaine étape : publier quelque chose d'intéressant. Chaud...

https://i.makeagif.com/media/6-05-2016/MGWt44.gif
Faire tomber de la grosse caillasse

Metal Zentangling 12

À la faveur des vacances, je me suis mis vite fait au zentangling.

En gros ça consiste à scribouiller des gribouillis tout en écoutant du métal à donf(*).  Exactement comme quand on s'ennuyait en cours.  C'est censé déstresser et sur moi ça marche plutôt pas mal.  Je vous mets une de mes œuvres, ainsi que le morceau de musique qui m'a inspiré.




(*) Euh, le métal ça a l'air facultatif en fait, mais moi j'en mets. À donf. Comme pour la méditation.

Metal Zentangling 11

À la faveur des vacances, je me suis mis vite fait au zentangling.

En gros ça consiste à scribouiller des gribouillis tout en écoutant du métal à donf(*).  Exactement comme quand on s'ennuyait en cours.  C'est censé déstresser et sur moi ça marche plutôt pas mal.  Je vous mets une de mes œuvres, ainsi que le morceau de musique qui m'a inspiré.






(*) Euh, le métal ça a l'air facultatif en fait, mais moi j'en mets. À donf. Comme pour la méditation.

Metal Zentangling 10

À la faveur des vacances, je me suis mis vite fait au zentangling.

En gros ça consiste à scribouiller des gribouillis tout en écoutant du métal à donf(*).  Exactement comme quand on s'ennuyait en cours.  C'est censé déstresser et sur moi ça marche plutôt pas mal.  Je vous mets une de mes œuvres, ainsi que le morceau de musique qui m'a inspiré.





(*) Euh, le métal ça a l'air facultatif en fait, mais moi j'en mets. À donf. Comme pour la méditation.

Metal Zentangling 9

 À la faveur des vacances, je me suis mis vite fait au zentangling.

En gros ça consiste à scribouiller des gribouillis tout en écoutant du métal à donf(*).  Exactement comme quand on s'ennuyait en cours.  C'est censé déstresser et sur moi ça marche plutôt pas mal.  Je vous mets une de mes œuvres, ainsi que le morceau de musique qui m'a inspiré.




(OK ce morceau là c'est pas du métal, mais ça m'inspire quand même)



(*) Euh, le métal ça a l'air facultatif en fait, mais moi j'en mets. À donf. Comme pour la méditation.