Advertisement
Guest User

Untitled

a guest
Dec 16th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. class Component:
  3. def __init__(self, name, start, end):
  4. self.name = name
  5. self.start = start
  6. self.end = end
  7.  
  8. def __repr__(self):
  9. return self.name
  10.  
  11.  
  12. class Border:
  13. def __init__(self, component, is_starting):
  14. self.component = component
  15. self.is_starting = is_starting
  16.  
  17.  
  18. class Node:
  19. def __init__(self, idx):
  20. self.idx = idx
  21. self.borders = []
  22.  
  23. def add_border(self, border):
  24. self.borders.append(border)
  25.  
  26. def __repr__(self):
  27. return "Index = %s (borders count = %s)" % (self.idx, len(self.borders))
  28.  
  29.  
  30. class Range: # range = отрезок
  31. def __init__(self, start, end):
  32. self.start = start
  33. self.end = end
  34. self.components = []
  35.  
  36. def add_component(self, component):
  37. self.components.append(component)
  38.  
  39. def __repr__(self):
  40. return "(%s, %s): %s" % (self.start, self.end, self.components)
  41.  
  42.  
  43. def find_node(list, filter):
  44. for i in range(len(list)):
  45. if filter(list[i]):
  46. return i
  47. return -1
  48.  
  49.  
  50. def main():
  51. data = [
  52. Component(name="Гс1", start=0, end=5),
  53. Component(name="Гс2", start=4, end=6),
  54. Component(name="Гс3", start=5, end=15),
  55. ]
  56.  
  57. nodes = [] # узлы
  58. for component in data:
  59. start_border = Border(component=component, is_starting=True)
  60. index = find_node(nodes, lambda x: x.idx == component.start) # ищем range со стартовым индексом
  61. if index != -1:
  62. nodes[index].add_border(start_border)
  63. else:
  64. new_range = Node(component.start)
  65. nodes.append(new_range)
  66. new_range.add_border(start_border)
  67.  
  68. end_border = Border(component=component, is_starting=False)
  69. index = find_node(nodes, lambda x: x.idx == component.end) # ищем range с конечным индексом
  70. if index != -1:
  71. nodes[index].add_border(end_border)
  72. else:
  73. new_range = Node(component.end)
  74. nodes.append(new_range)
  75. new_range.add_border(end_border)
  76.  
  77. nodes = sorted(nodes, key=lambda x: x.idx)
  78.  
  79. if (len(nodes) < 2):
  80. pass # it's your hometask
  81.  
  82. components_set = set()
  83. result = [] # конечный массив из отрезков
  84. for i in range(len(nodes) - 1):
  85. left_node = nodes[i]
  86. right_node = nodes[i + 1]
  87.  
  88. new_range = Range(left_node.idx, right_node.idx)
  89. for border in left_node.borders:
  90. if border.is_starting:
  91. components_set.add(border.component)
  92. else:
  93. components_set.remove(border.component)
  94.  
  95. for component in components_set:
  96. new_range.add_component(component)
  97.  
  98. result.append(new_range)
  99.  
  100.  
  101. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement