Refatore um algoritmo de construção de árvore.
Alguns fóruns da web têm um layout de árvore, então os posts são apresentados como uma árvore. No entanto, os posts normalmente ficam armazenados em um banco de dados como um conjunto não ordenado de registros. Assim, ao apresentar os posts ao usuário, a estrutura de árvore precisa ser reconstruída.
Sua tarefa será refatorar um trecho de código que funciona, mas é lento e feio, e que implementa a lógica de construção de árvore para registros altamente abstraídos. Os registros 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 registros (exclusive). Todos os registros têm um ID do pai menor que o próprio ID, exceto o registro raiz, cujo ID do pai é igual ao 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)
Às vezes é preciso lançar uma exceção. Quando você faz isso, deve sempre incluir uma mensagem de erro significativa para indicar qual é a origem do erro. Isso deixa seu código mais legível e ajuda bastante na depuração. Em situações em que você sabe que a origem do erro vai ser de um certo tipo, você pode escolher lançar um dos tipos de erro internos, mas ainda deve incluir uma mensagem significativa.
Este exercício em particular pede que você refatore como/onde a instrução raise é usada para "lançar" um ValueError para uma entrada de árvore inválida. Os testes só vão passar se o código tanto fizer raises na exception apropriada quanto incluir uma mensagem apropriada junto com ela.
Crie sua conta no Exercism para aprender e dominar Python com 17 conceitos146 exercícios e mentoria humana de verdade, tudo de graça.