Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- class Component:
- def __init__(self, name, start, end):
- self.name = name
- self.start = start
- self.end = end
- def __repr__(self):
- return self.name
- class Border:
- def __init__(self, component, is_starting):
- self.component = component
- self.is_starting = is_starting
- class Node:
- def __init__(self, idx):
- self.idx = idx
- self.borders = []
- def add_border(self, border):
- self.borders.append(border)
- def __repr__(self):
- return "Index = %s (borders count = %s)" % (self.idx, len(self.borders))
- class Range: # range = отрезок
- def __init__(self, start, end):
- self.start = start
- self.end = end
- self.components = []
- def add_component(self, component):
- self.components.append(component)
- def __repr__(self):
- return "(%s, %s): %s" % (self.start, self.end, self.components)
- def find_node(list, filter):
- for i in range(len(list)):
- if filter(list[i]):
- return i
- return -1
- def main():
- data = [
- Component(name="Гс1", start=0, end=5),
- Component(name="Гс2", start=4, end=6),
- Component(name="Гс3", start=5, end=15),
- ]
- nodes = [] # узлы
- for component in data:
- start_border = Border(component=component, is_starting=True)
- index = find_node(nodes, lambda x: x.idx == component.start) # ищем range со стартовым индексом
- if index != -1:
- nodes[index].add_border(start_border)
- else:
- new_range = Node(component.start)
- nodes.append(new_range)
- new_range.add_border(start_border)
- end_border = Border(component=component, is_starting=False)
- index = find_node(nodes, lambda x: x.idx == component.end) # ищем range с конечным индексом
- if index != -1:
- nodes[index].add_border(end_border)
- else:
- new_range = Node(component.end)
- nodes.append(new_range)
- new_range.add_border(end_border)
- nodes = sorted(nodes, key=lambda x: x.idx)
- if (len(nodes) < 2):
- pass # it's your hometask
- components_set = set()
- result = [] # конечный массив из отрезков
- for i in range(len(nodes) - 1):
- left_node = nodes[i]
- right_node = nodes[i + 1]
- new_range = Range(left_node.idx, right_node.idx)
- for border in left_node.borders:
- if border.is_starting:
- components_set.add(border.component)
- else:
- components_set.remove(border.component)
- for component in components_set:
- new_range.add_component(component)
- result.append(new_range)
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement