From e0ecafa9d0ba168ec33d9e933cc42a6d72f795f3 Mon Sep 17 00:00:00 2001 From: Pavel Patsey Date: Sun, 26 Jan 2025 10:45:05 +0300 Subject: [PATCH] changed the order of functions --- tests/cidr4_merge/test_cidr4_merger.py | 18 +++---- vpn_manager/cidr4_merge/cidr4_merger.py | 62 ++++++++++++------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/tests/cidr4_merge/test_cidr4_merger.py b/tests/cidr4_merge/test_cidr4_merger.py index 23995c4..502c567 100644 --- a/tests/cidr4_merge/test_cidr4_merger.py +++ b/tests/cidr4_merge/test_cidr4_merger.py @@ -4,7 +4,7 @@ from vpn_manager.cidr4_merge.cidr4_merger import ( find_neighbors, find_parent, make_cidr4, - merge_two_nodes, + merge_nodes, solution, ) @@ -62,13 +62,13 @@ def test_calc_dip(): assert calc_dip(3, 3, 1) == 2**30 -def test_merge_two_nodes(): - assert merge_two_nodes((0, 32), (1, 32)) == ((0, 31), 0) - assert merge_two_nodes((0, 32), (2, 32)) == ((0, 30), 2) - assert merge_two_nodes((0, 32), (5, 32)) == ((0, 29), 6) - assert merge_two_nodes((3, 32), (4, 32)) == ((0, 29), 6) - assert merge_two_nodes((0, 32), (4, 30)) == ((0, 29), 3) - assert merge_two_nodes((0, 32), (6, 31)) == ((0, 29), 5) +def test_merge_nodes(): + assert merge_nodes((0, 32), (1, 32)) == ((0, 31), 0) + assert merge_nodes((0, 32), (2, 32)) == ((0, 30), 2) + assert merge_nodes((0, 32), (5, 32)) == ((0, 29), 6) + assert merge_nodes((3, 32), (4, 32)) == ((0, 29), 6) + assert merge_nodes((0, 32), (4, 30)) == ((0, 29), 3) + assert merge_nodes((0, 32), (6, 31)) == ((0, 29), 5) def test_find_neighbors(): @@ -96,7 +96,7 @@ def test_find_neighbors(): ] -def test_merge_nodes(): +def test_solution(): assert solution( [ (0, 32), diff --git a/vpn_manager/cidr4_merge/cidr4_merger.py b/vpn_manager/cidr4_merge/cidr4_merger.py index 024df9b..baf5457 100644 --- a/vpn_manager/cidr4_merge/cidr4_merger.py +++ b/vpn_manager/cidr4_merge/cidr4_merger.py @@ -9,6 +9,34 @@ class Cidr4MergerError(Exception): pass +def find_subnets(nodes: list[Node]) -> list[tuple[Node, Node]]: + subnets = [] + for i, (a, b) in enumerate(zip(nodes, nodes[1:])): + parent_node, dip = merge_nodes(a, b) + if parent_node == a or parent_node == b: + subnets.append((a, b)) + return subnets + + +def ensure_no_subnets(nodes: list[Node]): + if subnets := find_subnets(nodes): + raise Cidr4MergerError(f"There are subnets! {subnets=}") + + +def find_neighbors(nodes: list[Node]) -> list[tuple[int, Node, Node]]: + neighbors = [] + for i, (a, b) in enumerate(zip(nodes, nodes[1:])): + parent_node, dip = merge_nodes(a, b) + if parent_node[1] + 1 == a[1] == b[1]: + neighbors.append((i, a, b)) + return neighbors + + +def ensure_no_neighbors(nodes: list[Node]): + if neighbors := find_neighbors(nodes): + raise Cidr4MergerError(f"There are neighbors! {neighbors=}") + + def find_parent(a: Node, b: Node) -> Node: ia, la = a ib, lb = b @@ -31,7 +59,7 @@ def calc_dip(la: int, lb: int, lp: int) -> int: return dip(la, lp) + dip(lb, lp) -def merge_two_nodes(a: Node, b: Node) -> tuple[Node, int]: +def merge_nodes(a: Node, b: Node) -> tuple[Node, int]: p = find_parent(a, b) dip = calc_dip(a[1], b[1], p[1]) return p, dip @@ -42,7 +70,7 @@ def solution(nodes: list[Node], req_len: int) -> tuple[list[Node], int]: while len(nodes) > req_len: min_t = None, None, float("inf") for i, (a, b) in enumerate(zip(nodes, nodes[1:])): - p, dip = merge_two_nodes(a, b) + p, dip = merge_nodes(a, b) if dip < min_t[2]: min_t = i, p, dip i, p, dip = min_t @@ -51,41 +79,13 @@ def solution(nodes: list[Node], req_len: int) -> tuple[list[Node], int]: while nbs := find_neighbors(nodes): i, a, b = nbs[0] - p, dip = merge_two_nodes(a, b) + p, dip = merge_nodes(a, b) nodes = nodes[:i] + [p] + nodes[i + 2 :] sum_dip += dip return nodes, sum_dip -def find_subnets(nodes: list[Node]) -> list[tuple[Node, Node]]: - subnets = [] - for i, (a, b) in enumerate(zip(nodes, nodes[1:])): - parent_node, dip = merge_two_nodes(a, b) - if parent_node == a or parent_node == b: - subnets.append((a, b)) - return subnets - - -def ensure_no_subnets(nodes: list[Node]): - if subnets := find_subnets(nodes): - raise Cidr4MergerError(f"There are subnets! {subnets=}") - - -def find_neighbors(nodes: list[Node]) -> list[tuple[int, Node, Node]]: - neighbors = [] - for i, (a, b) in enumerate(zip(nodes, nodes[1:])): - parent_node, dip = merge_two_nodes(a, b) - if parent_node[1] + 1 == a[1] == b[1]: - neighbors.append((i, a, b)) - return neighbors - - -def ensure_no_neighbors(nodes: list[Node]): - if neighbors := find_neighbors(nodes): - raise Cidr4MergerError(f"There are neighbors! {neighbors=}") - - def main(): required_len = 20 data = get_data()