Desafío de carpetas (Parte n.º 2)
Esta es una continuación de la parte n.º 1, con la misma configuración, pero con un objetivo diferente.
Un sistema de carpetas en una computadora podría verse como en la imagen de abajo:

En este desafío, los sistemas de carpetas se representarán mediante diccionarios, donde las claves son carpetas X y el valor de X es la lista de subcarpetas de X.
Por ejemplo, la imagen anterior se convierte en el diccionario:
{
"A": ["B", "C", "D"],
"B": ["E", "F"],
"D": ["G", "H"],
"G": ["I", "J"],
"H": ["K"]
}Las entradas de este desafío serán:
- Un diccionario que representa un sistema de carpetas.
- Dos carpetas
XyY.
Escribe una función que encuentre la carpeta "más pequeña" que contenga tanto X como Y (en la ilustración, esta es la carpeta más baja desde la que puedes avanzar hacia abajo hasta llegar a X y Y; o, si ves el sistema como un "árbol genealógico", es el último ancestro común).
Ejemplos
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"Notas
- Todos los ejemplos anteriores usan el sistema de carpetas de la ilustración, pero las pruebas usarán otros sistemas de carpetas.
- Para los fines de este desafío, cualquier carpeta está dentro de sí misma, como en los dos últimos ejemplos.