take into account the case when neighbors could remain

This commit is contained in:
Pavel Patsey
2025-01-24 14:01:47 +03:00
parent f9f711ca0b
commit 735a3c0216
2 changed files with 42 additions and 7 deletions
+15 -5
View File
@@ -55,21 +55,31 @@ def merge_nodes(nodes: list[Node], required_len: int) -> tuple[list[Node], int]:
nodes = nodes[:idx] + [parent_node] + nodes[idx + 2 :]
sum_dip += dip
# for i, (a, b) in enumerate(zip(nodes, nodes[1:])):
# parent_node, dip = merge_two_nodes(a, b)
# assert parent_node != a
# assert parent_node != b
while neighbors := find_neighbors(nodes):
idx, a, b = neighbors[0]
parent_node, dip = merge_two_nodes(a, b)
nodes = nodes[:idx] + [parent_node] + nodes[idx + 2 :]
sum_dip += dip
return nodes, sum_dip
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 main():
required_len = 20
data = get_data()
nodes = sorted(map(cidr4_to_node, data))
merged_nodes, sum_dip = merge_nodes(nodes, required_len)
cidr4s = [make_cidr4(ip, mask_len) for ip, mask_len in merged_nodes]
print(sorted(cidr4s), sum_dip, sep="\n")
print(cidr4s, sum_dip, sep="\n")
if __name__ == "__main__":