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 X e Y.

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.