0votos

Futuro rey en Python

por mmuuoo hace 8 días

devuelve una lista de nombres ordenada de mas generaciones a menos,el codigo esta comentado

En una tierra desconocida se intenta decidir quien será el proximo rey, para ello, deciden que la persona con mas generaciones nobles pasará a poseer la corona.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
def separar(descendencia):                              # devuelve la lista de padres y lista de hijos 
 
    padres = list() 
    hijos = list() 
     
    for padre in descendencia: 
 
        padres.append(padre)                            # todas las entradas del dicc. son padres 
         
        hijos = list(hijos+list(descendencia[padre]))   # concatena las listas de hijos  
     
    return (padres ,set(hijos))                    # con set se eliminan repeticiones 
 
def lista_candidatos(nombres,muertos):                  # devuelve una lista de possibles candidatos 
 
    result = list() 
 
    for nombre in nombres: 
 
        if(nombre not in muertos):                      # los que no esten muertos pueden ser candidatos 
 
            result.append(nombre) 
 
    return result 
 
def generaciones_de(nombre,descendencia):               #devuelve el numero de generaciones de un candidato 
 
    generaciones = 0                                    #contador a 0 
 
    padre = buscar_padre(nombre,descendencia)           # busca el padre 
 
    while(padre!=None):                                 #  mientras encuentre padre 
 
        generaciones += 1                               # generaciones+1 
        padre = buscar_padre(padre,descendencia)        # busca el siguiente padre   
 
    return generaciones 
 
def buscar_padre(nombre,descendencia):                  # devuelve el padre de candidato o None 
 
    for padre in descendencia: 
 
        if(nombre in descendencia[padre]):              #para cada padre del dicc. busca si nombre esuno de sus hijos 
 
            return padre                                #lo devuelve si lo encuentra 
 
    return None                                         #sino lo ecuentra devuelve None 
 
def candidatos(descendencia,muertos):                   # devuelve la lista de candidatos   
                                                         
    result = list() 
    linajes = list() 
        
    (padres , hijos) = separar(descendencia)                                    # separa hijos y padres 
 
    candidatos = lista_candidatos(hijos | set(padres),muertos)                  # possibles candidatos 
 
    for candidato in candidatos:                                                # para cada candidato 
 
    # busca las generaciones de su linaje           
        result.append((candidato,generaciones_de(candidato,descendencia)))       
 
    #  En mi opinion seria mas util devolver aqui el resultado,  
    # la lista de tuplas ((nombre1,4),(nomre2,3),...) 
 
    return map(lambda x: x[0],sorted(result,key=lambda x: x[1],reverse=True))   # Finalmente ordena el resultado y devuelvelalista solo de nomres 
 
 
""" 
    Listasde prueba 
""" 
hijos = {'Pepe':set(['Manolo','Benito','Osvaldo']),'Juan':set(['Pedro','Benjamin','Maria']),'Manolo':set(['Carlos','Vero','Kevin']),'Vero':set(['Miguelin','Jesusin','Abel'])} 
muertos = set(['Pepe','Manolo','Osvaldo','Pedro','Benjamin','Abel','Jesusin']) 
 
print candidatos(hijos,muertos)     # pinta la lista 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.