No estoy muy convencido. Habría que repasar la lista de las conexiones filtradas, por si pueden generar agrupaciones. Pero resuelve la cuestión.
= = = = = = = = = =
import re
# -------------------
# pasar lista a cadena
# -------------------
def pasarLista(listado):
cadena=[]
for subcadena in listado:
for item in subcadena:
cadena.append(item)
return "".join(cadena) # envía la cadena.
def filtro(listado,quitar):
cadena=[]
for subcadena in listado:
if (not subcadena[0] in quitar and not subcadena[1] in quitar):
cadena.append(subcadena)
return cadena
# ----------------
# función problema
# ----------------
def subnetworks(net, crushes):
suma = 0
# 1/ Construir una cadena con las conexiones.
# hay una conexión a la fuente.
cadena=pasarLista(net)
cadena2=filtro(net,crushes)
# 2/ Quitar los que estén en crushes - poner guiones.
cadenaCrushes="".join(sorted([i for i in crushes]))
cadenaNodos=re.sub("["+cadenaCrushes+"]",r"-",cadena)
# cadenaNodos=re.sub("["+cadenaCrushes+"]",r"-","BABBACCDHHFDCACBACSE")
# 3/ Obteniendo lista de grupos en cadenaNodos
# unicos --> grupos de un solo nodo
# conjunto --> cadena agrupando nodos
conjunto=[j for i in cadena2 for j in i]
unicos=[i for i in cadenaNodos.split("-") if len(i)==1]
#4/ A partir de la cadena conjunto
# si único está en la lista conjunto, quitar de único
for j in conjunto:
if j in unicos:
unicos.remove(j)
# print(cadena,cadenaCrushes,cadenaNodos,unicos,conjunto)
# print(cadena2)
# print(len(cadena2)+len(unicos))
# La solución es la suma de los nodos filtrados +
# los nodos que se han quedado sueltos en único
# a menos de que tenga que hacer algo más en CONJUNTO
return len(cadena2)+len(unicos)
if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
assert subnetworks([
['A', 'B'],
['B', 'C'],
['C', 'D']
], ['B']) == 2, "First 2"
assert subnetworks([
['A', 'B'],
['A', 'C'],
['A', 'D'],
['D', 'F'],
], ['A']) == 3 , "Second 3"
assert subnetworks([
['A', 'B'],
['B', 'C'],
['C', 'D']
], ['C', 'D']) == 1, "Third 1"
assert subnetworks([
['A', 'B'],
['A', 'C'],
['A', 'D'],
['D', 'F'],
['B', 'C'],
], ['A']) == 2, "Second-BIS 2"
print('Done! Check button is waiting for you!')
No hay comentarios:
Publicar un comentario