-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
57 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
# -*- coding: utf-8 -*- | ||
|
||
|
||
import re | ||
import sys | ||
import string | ||
import unicodedata | ||
|
||
# On va tocker les mots dans ce dico | ||
mots = {} | ||
|
||
# Je récupère en vrac le contenu du fichier. Comme on a pas de gestion des | ||
# erreurs, je récupère cash pistache le chemin de la ligne de commande | ||
# et je suppose un encoding en UTF8. Le résultat obtenu est un objet | ||
# unicode de tout le texte du fichier, sans le caractère 'œ'. | ||
texte = open(sys.argv[1]).read().decode('utf8').replace(u'œ', 'oe') | ||
|
||
# Astuce pour normaliser les caractères spéciaux. Ne marche que pour | ||
# l'alphabet latin malheureusement. Donc le script est limité. Unidecode | ||
# permettrait d'avoir un script plus générique. | ||
texte = unicodedata.normalize('NFKD', texte).encode('ascii', 'ignore') | ||
|
||
# string.ascii_lowercase contient toutes les lettres ASCII en minuscule, | ||
# ce qui permet de faire un remplacement, via regex, de | ||
# [^abcdefghijklmnopqrstuvwxyz]', c'est à dire tout ce qui n'est pas | ||
# une lettre ASCII minuscule. | ||
texte = re.sub(r'[^%s]' % string.ascii_lowercase, ' ', texte.lower()) | ||
|
||
# Je récupère tous les "mots", split() sans paramètre coupe en effet toute | ||
# combinaison de caractères non imprimables. enumerate() me permet d'avoir | ||
# la position de chaque mot. setdefault() me permet d'ignorer les clé qui | ||
# n'existe pas encore dans le dico. J'aurais pu utiliser un defaultdict, mais | ||
# comme on a qu'une seule ligne ici, c'est plus court. | ||
# J'obtient donc un dico {mot1: [positon1, position2, ...], mot2: ...} | ||
for i, e in enumerate(texte.split()): | ||
mots.setdefault(e, []).append(i) | ||
|
||
# On récupère le contenu du dico sous forme de liste de tuples | ||
# [(mot, positions)...], et on l'ordonne selon le nombre d'apparitions | ||
# (len(x[1])), ou a défaut par ordre naturel des apparitions sorted(x[1]). | ||
# Pour rappel, key attend une fonction qui prend chaque élement, et retourne | ||
# une clé. La clé est utilisé pour ordonner les éléments : chaque élément | ||
# voit sa clé comparée à celle des autres, et ordonnée par ordre naturel. | ||
# Y a un article sur ça : http://sametmax.com/ordonner-en-python/ | ||
# En gros, une entrée ('salut', 4, 18) aura pour clé (2, (4, 18)), | ||
# ce que Python peut comparer facilement. | ||
# Je réalise en rédigeant ces lignes que mon sorted est inutile, puisque | ||
# le processus est incrémental et déjà ordonné. Je le laisse comme référence. | ||
mots = sorted(mots.items(), key=lambda x: (len(x[1]), sorted(x[1]))) | ||
|
||
# Et on affiche tout ça, non sans caster les position du type int vers str | ||
# pour éviter un crash | ||
for mot, positions in mots: | ||
print('- %s: %s' % (mot, ', '.join(map(str, positions)))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
« La marche des vertueux est semée d'obstacles qui sont les entreprises égoïstes que fait sans fin surgir l'œuvre du Malin. Béni soit-il l'homme de bonne volonté qui, au nom de la charité, se fait le berger des faibles qu'il guide dans la vallée d'ombre, de la mort et des larmes, car il est le gardien de son frère et la providence des enfants égarés. J'abattrai alors le bras d'une terrible colère, d'une vengeance furieuse et effrayante sur les hordes impies qui pourchassent et réduisent à néant les brebis de Dieu. Et tu connaîtras pourquoi mon nom est l'éternel quand sur toi s'abattra la vengeance du Tout-Puissant ! » | ||
|
||
Ça fait des années que je répète ça. L'enfoiré qui l'entend, il meurt aussitôt. J'avais jamais cherché à comprendre, je trouvais seulement que ça en jetait de dire ça avant de flinguer un mec. Et puis ce matin, j'ai vu quelque chose qui m'a fait réfléchir. D'un seul coup, je me dis, ça pourrait bien vouloir dire que tu es l'œuvre du malin, et que l'homme vertueux c'est moi, et que mon joli 9 mm ce serait mon protecteur, mon berger dans la vallée de l'angoisse et des larmes. Ou encore mieux, c'est moi le berger et toi l'homme vertueux, et c'est le monde qui est l'œuvre de Lucifer. Qu'est-ce que tu dis de ça ? Mais rien de tout ça n'est juste. Ce qui est vrai, c'est que tu es le faible et que je suis la tyrannie des méchants. Et moi j'essaie, Ringo, au prix d'un effort harassant, de protéger les faibles. |