Refatora um algoritmo de construção de árvores.
Alguns fóruns da web têm um layout em árvore, por isso as publicações são apresentadas como uma árvore. No entanto, as publicações são normalmente guardadas numa base de dados como um conjunto não ordenado de registos. Assim, ao apresentar as publicações ao utilizador, é preciso reconstruir a estrutura em árvore.
O teu trabalho será refatorar um pedaço de código que funciona, mas é lento e feio, e que implementa a lógica de construção de árvores para registos fortemente abstraídos. Os registos contêm apenas um número de ID e um número de ID do pai. O número de ID está sempre entre 0 (inclusive) e o comprimento da lista de registos (exclusive). Todos os registos têm um ID do pai inferior ao seu próprio ID, exceto o registo raiz, cujo ID do pai é igual ao seu próprio ID.
Um exemplo de árvore:
root (ID: 0, parent ID: 0)
|-- child1 (ID: 1, parent ID: 0)
| |-- grandchild1 (ID: 2, parent ID: 1)
| +-- grandchild2 (ID: 4, parent ID: 1)
+-- child2 (ID: 3, parent ID: 0)
| +-- grandchild3 (ID: 6, parent ID: 3)
+-- child3 (ID: 5, parent ID: 0)
Por vezes é necessário lançar uma exceção. Quando o fazes, deves incluir sempre uma mensagem de erro significativa que indique qual é a origem do erro. Isto torna o teu código mais legível e ajuda imenso na depuração. Em situações em que sabes que a origem do erro é de um determinado tipo, podes optar por lançar um dos tipos de erro incorporados, mas mesmo assim deves incluir uma mensagem significativa.
Este exercício em particular exige que refatores a forma e o local onde a instrução raise é usada para "lançar" um ValueError quando o valor de entrada para a árvore é inválido. Os testes só passam se o código fizer raise da exception adequada e incluir também uma mensagem adequada.
Inscreve-te no Exercism para aprenderes e dominares Python com 17 conceitos146 exercícios, e mentoria humana real, tudo grátis.