Desafio das pastas (Parte #2)
Esta é uma continuação da parte #1, com a mesma configuração, mas com um objetivo diferente.
Um sistema de pastas em um computador poderia ser parecido com a imagem abaixo:

Neste desafio, os sistemas de pastas serão representados por dicionários, nos quais as chaves são pastas X e o valor de X é a lista de subpastas de X.
Por exemplo, a imagem acima se transforma no dicionário:
{
"A": ["B", "C", "D"],
"B": ["E", "F"],
"D": ["G", "H"],
"G": ["I", "J"],
"H": ["K"]
}As entradas para este desafio serão:
- Um dicionário que representa um sistema de pastas.
- Duas pastas
XeY.
Escreva uma função que encontre a pasta "menor" que contenha X e Y (na ilustração, esta é a pasta mais baixa a partir da qual você pode descer até X e Y; ou, se você visualizar o sistema como uma "árvore genealógica", este é o último ancestral comum).
Exemplos
last_ancestor({
"A": ["B", "C", "D"],
"B": ["E", "F"],
"D": ["G", "H"],
"G": ["I", "J"],
"H": ["K"]
}, "B", "C") ➞ "A"
last_ancestor({
"A": ["B", "C", "D"],
"B": ["E", "F"],
"D": ["G", "H"],
"G": ["I", "J"],
"H": ["K"]
}, "I", "J") ➞ "G"
last_ancestor({
"A": ["B", "C", "D"],
"B": ["E", "F"],
"D": ["G", "H"],
"G": ["I", "J"],
"H": ["K"]
}, "I", "K") ➞ "D"
last_ancestor({
"A": ["B", "C", "D"],
"B": ["E", "F"],
"D": ["G", "H"],
"G": ["I", "J"],
"H": ["K"]
}, "D", "I") ➞ "D"
last_ancestor({
"A": ["B", "C", "D"],
"B": ["E", "F"],
"D": ["G", "H"],
"G": ["I", "J"],
"H": ["K"]
}, "G", "G") ➞ "G"Observações
- Todos os exemplos acima usam o sistema de pastas da ilustração, mas os testes usarão outros sistemas de pastas.
- Para os fins deste desafio, qualquer pasta está dentro de si mesma, como nos dois últimos exemplos.