From 151f8492b419765c61b6ec2c44909f8068bcd72a Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 16 Jan 2025 10:47:32 +0100 Subject: [PATCH] added exercise 1 --- ex1_triangles.py | 40 ++++++++++++++++++++++++++++++++++++++++ test_ex1.py | 20 ++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 ex1_triangles.py create mode 100644 test_ex1.py diff --git a/ex1_triangles.py b/ex1_triangles.py new file mode 100644 index 0000000..9c54648 --- /dev/null +++ b/ex1_triangles.py @@ -0,0 +1,40 @@ +""" +Question 1 - De fils en tapis + +But : en partant d'une liste des arêtes d'un graphe, compter le nombre + de triangles qu'il contient + +Approche : + +Un triangle est un ensemble de trois sommets / trois arêtes relier les uns aux autres +On peut donc ainsi parcourir l'ensemble des sommets, puis compter le nombre de voisins +qui sont également voisins d'un autre voisin. +Par exemple : +a <-> b, b <-> c, c <-> a + +Parmi les voisins de a, b est aussi un voisin de c (lui-même voisin direct de a). + +Si aucune attention particulière n'est portée aux redondances, il faudra diviser +par six le total obtenu, car chaque triangle aura été comptabilisé six fois, +deux fois par sommet (p. ex. abc et acb pour le sommet a). +""" + +def countTriangles(edges: list[tuple[int, int]]) -> int: + neighbors: dict[int, set[int]] = {} + for node1, node2 in edges: + if node1 not in neighbors: + neighbors[node1] = set() + if node2 not in neighbors: + neighbors[node2] = set() + + neighbors[node1].add(node2) + neighbors[node2].add(node1) + + total: int = 0 + for node1, neighbors1 in neighbors.items(): + for node2 in neighbors1: + neighbors2: set[int] = neighbors[node2] + common: set[int] = neighbors1.intersection(neighbors2) + total += len(common) + + return total // 6 \ No newline at end of file diff --git a/test_ex1.py b/test_ex1.py new file mode 100644 index 0000000..78e2d81 --- /dev/null +++ b/test_ex1.py @@ -0,0 +1,20 @@ +import unittest + +from ex1_triangles import countTriangles + + +class MyTestCase(unittest.TestCase): + def test_simple1(self): + self.assertEqual( + countTriangles([(0, 1), (1, 2), (0, 2)]), + 1 + ) + def test_simple2(self): + self.assertEqual( + countTriangles([(2, 1), (1, 2), (2, 3)]), + 0 + ) + + +if __name__ == '__main__': + unittest.main()