Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for How to Find Friends by laserpez
class Node (object):
def __init__(self, name):
super(Node, self).__init__()
self._name = name
self._friends = set()
def add_friend(self, node):
self._friends.add(node)
def __str__(self):
return self._name
class Wrapper (object):
def __init__(self, nodes):
super(Wrapper, self).__init__()
self._nodes = nodes
def For(self, element_name):
for i, j in enumerate(self._nodes):
if str(j) == element_name:
return j
def look(nodes):
return Wrapper(nodes)
def friends(cloud):
f = set()
for e in cloud:
f |= e._friends
return f
def method(cloud, elem2):
reachable = friends(cloud) - cloud
if not reachable:
return elem2 in cloud
return method(cloud | reachable, elem2)
def check_connection(couples, elem1_name, elem2_name):
from itertools import chain
plain_nodes = set(chain.from_iterable(e.split('-') for e in couples))
nodes = [Node(e) for e in plain_nodes]
for couple in couples:
a, b = couple.split('-')
node_a = look(nodes).For(a)
node_b = look(nodes).For(b)
node_a.add_friend(node_b)
node_b.add_friend(node_a)
elem1 = look(nodes).For(elem1_name)
elem2 = look(nodes).For(elem2_name)
return method({elem1}, elem2)
if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
assert check_connection(
("dr101-mr99", "mr99-out00", "dr101-out00", "scout1-scout2",
"scout3-scout1", "scout1-scout4", "scout4-sscout", "sscout-super"),
"scout2", "scout3") == True, "Scout Brotherhood"
assert check_connection(
("dr101-mr99", "mr99-out00", "dr101-out00", "scout1-scout2",
"scout3-scout1", "scout1-scout4", "scout4-sscout", "sscout-super"),
"super", "scout2") == True, "Super Scout"
assert check_connection(
("dr101-mr99", "mr99-out00", "dr101-out00", "scout1-scout2",
"scout3-scout1", "scout1-scout4", "scout4-sscout", "sscout-super"),
"dr101", "sscout") == False, "I don't know any scouts."
Jan. 2, 2015