"""Écrivez un code qui extrait les liens du texte brut et les trie selon des règles spécifiques.
La liste de liens qui sera renvoyée ne doit pas contenir de doublons.
Les règles de tri sont les suivantes :
- Priorité 1 : d'abord les premiers liens détectés en quantité de self.first_extracted_links
- Priorité 2 : ensuite les liens vers des disques en nuage et des documents (Yandex Disk, etc.)
- Priorité 3 : puis les liens vers des fichiers (avec extensions .exe, .pdf, .rar, etc. à la fin du chemin)
- Priorité 4 : les autres liens triés par ordre décroissant de longueur de chaîne
Il faut également prendre en compte la limite du nombre de liens et implémenter un gestionnaire de contexte.
On peut l'exécuter, par exemple, dans [link]
En résumé :
- 30 minutes sont allouées à l'exécution
- Écrire les fonctions apply, process, et celles pour le gestionnaire de contexte
- Tous les tests doivent réussir
- Les tests ne peuvent pas être modifiés
- Il est permis d'utiliser des imports
- Après avoir écrit, on peut vérifier en exécutant localement et corriger si nécessaire
regex pour rechercher des liens : (?:https?|ftp):\/\/(?:[a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.[a-zA-Z]{2,}(?::\d+)?(?:\/[^\s()]*)?"""
class LinkExtractor:
DEFAULT_CLOUDS = frozenset((
"drive.google.com",
"mediafire.com",
"yadi.sk",
"disk.yandex.ru",
"cloud.mail.ru",
"mega.nz"
))
# Peut étendre cette méthode ou la réécrire
def __init__(self, max_links: int = 7, first_extracted_links: int = 2, clouds = None):
# Nombre maximum de liens à retourner
self.max_links = max_links
# Nombre de liens extraits pour la première condition
self.first_extracted_links = first_extracted_links
# Liste de domaines considérés comme dans le cloud pour la deuxième condition
self.clouds = clouds or self.DEFAULT_CLOUDS
self._results = []
# Écrire cette méthode, qui ajoute une partie du texte à analyser
def apply(self, text) -> "LinkExtractor":
...
return self