"""Escreva um código que extraia links do texto bruto e os ordene de acordo com regras específicas.
A lista de links que será retornada não deve conter duplicados.
As regras de ordenação são as seguintes:
- Prioridade 1: Primeiro, os links detectados inicialmente, na quantidade de self.first_extracted_links
- Prioridade 2: Depois, links para discos na nuvem e documentos (Yandex Disk, etc.)
- Prioridade 3: Em seguida, links para arquivos (com extensões .exe, .pdf, .rar, etc. ao final do caminho)
- Prioridade 4: Os links restantes ordenados de maior a menor comprimento de string
Também deve considerar a limitação na quantidade de links e implementar um gerenciador de contexto.
Pode ser executado, por exemplo, em [link]
Resumindo:
- São concedidos 30 minutos para execução
- Escrever funções apply, process, funções para o gerenciador de contexto
- Todos os testes devem passar
- Os testes não podem ser modificados
- Pode usar importações
- Após escrever, pode verificar executando localmente e corrigir se necessário
regex para busca de links: (?: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"
))
# Pode ampliar este método ou reescrevê-lo
def __init__(self, max_links: int = 7, first_extracted_links: int = 2, clouds = None):
# Número máximo de links a serem retornados
self.max_links = max_links
# Quantidade de links extraídos para a primeira condição
self.first_extracted_links = first_extracted_links
# Lista de domínios considerados na nuvem para a segunda condição
self.clouds = clouds or self.DEFAULT_CLOUDS
self._results = []
# Escrever este método, que adiciona parte do texto para análise
def apply(self, text) -> "LinkExtractor":
...
return self