Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.26 KB | None | 0 0
  1. > store = IntervalStore.new
  2. []
  3. > store.add(1, 2)
  4. [[1, 2]]
  5. > store.add(5, 6)
  6. [[1, 2], [5, 6]]
  7. > store.add(1, 4)
  8. [[1, 4], [5, 6]]
  9. > store.add(1, 2)
  10. [[1, 4], [5, 6]]
  11. > store.add(3, 5)
  12. [[1, 6]]
  13. > store.add(0, 7)
  14. [[0, 7]]
  15.  
  16. class IntervalStore(object):
  17. def __init__(self):
  18. self.store = []
  19.  
  20. def filter_result(self, flatten_store, low_index, upp_index):
  21. useless_values = filter(lambda value: low_index < flatten_store.index(value) < upp_index, flatten_store)
  22. flatten_store = filter(lambda value: value not in useless_values, flatten_store)
  23. self.store = []
  24. for i, k in zip(flatten_store[0::2], flatten_store[1::2]):
  25. self.store.append([i, k])
  26.  
  27. def add(self, low, upp):
  28. flatten_store = [number for pair in self.store for number in pair]
  29. low_index, upp_index = self.index_of(low, flatten_store), self.index_of(upp, flatten_store)
  30.  
  31. if low_index >= 0 and upp_index >= 0:
  32. if low_index % 2 != 0:
  33. low_index -= 1
  34. if upp_index % 2 == 0:
  35. upp_index += 1
  36. elif low_index >= 0 > upp_index:
  37. if low_index % 2 != 0:
  38. low_index -= 1
  39. flatten_store.append(upp)
  40. flatten_store = sorted(flatten_store)
  41. upp_index = self.index_of(upp, flatten_store)
  42. if upp_index % 2 != 0:
  43. upp_index += 1
  44. elif low_index < 0 <= upp_index:
  45. if upp_index % 2 == 0:
  46. upp_index += 1
  47. flatten_store.append(low)
  48. flatten_store = sorted(flatten_store)
  49. low_index = self.index_of(low, flatten_store)
  50. if low_index % 2 != 0:
  51. low_index -= 1
  52. upp_index += 1
  53. else:
  54. flatten_store.append(low)
  55. flatten_store.append(upp)
  56. flatten_store = sorted(flatten_store)
  57. low_index, upp_index = self.index_of(low, flatten_store), self.index_of(upp, flatten_store)
  58.  
  59. if low_index % 2 != 0:
  60. low_index -= 1
  61. if upp_index % 2 == 0:
  62. upp_index += 1
  63. self.filter_result(flatten_store, low_index, upp_index)
  64.  
  65. def index_of(self, value, list):
  66. try:
  67. return list.index(value)
  68. except ValueError:
  69. return -1
  70.  
  71. class IntervalStore
  72.  
  73. def initialize
  74. @store = []
  75. end
  76.  
  77. def to_s
  78. "[#{@store.map{ |i| "[#{i.first}, #{i.last}]" }.join(', ')}]"
  79. end
  80.  
  81. # TODO - implement this method
  82. def add(low, upp)
  83. flatten_store = @store.flatten
  84.  
  85. low_index, upp_index = flatten_store.index(low), flatten_store.index(upp)
  86. if low_index and upp_index
  87. low_index -=1 if low_index.odd?
  88. upp_index +=1 if upp_index.even?
  89. elsif low_index and !upp_index
  90. low_index -= 1 if low_index.odd?
  91. (flatten_store << upp).sort!
  92. upp_index = flatten_store.index(upp)
  93. upp_index += 1 if upp_index.odd?
  94. elsif !low_index and upp_index
  95. upp_index += 1 if upp_index.even?
  96. (flatten_store << low).sort!
  97. low_index = flatten_store.index(low)
  98. low_index -= 1 if low_index.odd?
  99. upp_index += 1
  100. else
  101. (flatten_store << low << upp).sort!
  102. low_index, upp_index = flatten_store.index(low), flatten_store.index(upp)
  103.  
  104. low_index -= 1 if low_index.odd?
  105. upp_index += 1 if upp_index.even?
  106. end
  107.  
  108. filter_result = filter_store(flatten_store, low_index, upp_index)
  109. format_result(filter_result)
  110. end
  111.  
  112. def format_result(rest)
  113. @store = []
  114. rest.each_slice(2) { |pair_values| @store << pair_values }
  115. @store
  116. end
  117.  
  118. def filter_store(flatten_store, low_index, upp_index)
  119. flatten_store.clone.delete_if do |value|
  120. flatten_store_index = flatten_store.index(value)
  121. low_index < flatten_store_index and flatten_store_index < upp_index
  122. end
  123. end
  124. end
  125.  
  126. def format_result(rest)
  127. @store = rest.each_slice(2).to_a
  128. end
  129.  
  130. def filter_store(flatten_store, low_index, upp_index)
  131. flatten_store[0..low_index] + flatten_store[high_index..-1]
  132. end
  133.  
  134. b < c - undershoot
  135. a < c, b >= c, b <= d - left overlap
  136. a <= c, b >= d - total overlap
  137. a >= c, b <= d - subsection
  138. a > c, b > d - right overlap
  139. a > d - overshoot
  140.  
  141. class IntervalStore(object):
  142. def __init__(self):
  143. self.range_list = []
  144. def __str__(self):
  145. return str(self.range_list)
  146.  
  147. def __repr__(self):
  148. return str(self)
  149.  
  150. def add(self, low, high):
  151. for interval in self.range_list:
  152. if interval[0] <= low and interval[1] >= high:
  153. return
  154. if interval[0] > high or interval[1] < low:
  155. continue
  156. else:
  157. self.range_list.remove(interval)
  158. self.add(min([interval[0], low]), max([interval[1], high]))
  159. return
  160. if len(self.range_list) == 0:
  161. self.range_list.append( [low, high])
  162. else:
  163. insert_index = 0
  164. while insert_index < len(self.range_list) and high > self.range_list[insert_index][0]:
  165. insert_index += 1
  166. self.range_list.insert(insert_index, [low, high])
  167.  
  168. class Interval < Range
  169. # Check if another interval overlaps this one
  170. def overlap?(other)
  171. cover?(other.min) || cover?(other.max)
  172. end
  173.  
  174. # Return a new Interval by merging this one with another
  175. def merge(other)
  176. Interval.new([min, other.min].min, [max, other.max].max)
  177. end
  178.  
  179. # Simplified array representation
  180. def to_a
  181. [min, max]
  182. end
  183. end
  184.  
  185. class IntervalStore
  186. def initialize
  187. @intervals = []
  188. end
  189.  
  190. def add(min, max)
  191. @intervals.push(Interval.new(min, max))
  192. @intervals.sort_by!(&:min)
  193. @intervals = @intervals.inject([]) do |merged, interval|
  194. if merged.any? && merged.last.overlap?(interval)
  195. merged << merged.pop.merge(interval)
  196. else
  197. merged << interval
  198. end
  199. end
  200. end
  201.  
  202. # Returns an array representation
  203. def to_a
  204. @intervals.map(&:to_a)
  205. end
  206. end
  207.  
  208. class IntervalStore < Array
  209. def initialize
  210. super
  211. end
  212.  
  213. def add(low, high)
  214. push([low, high])
  215. sort_by!(&:first)
  216. collapse
  217. end
  218.  
  219. private
  220.  
  221. def collapse
  222. collapsed = inject([]) do |merged, interval|
  223. can_merge = merged.any? && overlap?(merged.last, interval)
  224. merged << (can_merge ? merge(merged.pop, interval) : interval)
  225. end
  226. clear.concat(collapsed)
  227. end
  228.  
  229. def overlap?(a, b)
  230. a = Range.new(*a) # just for the `cover?` method
  231. a.cover?(b.first) || a.cover?(b.last)
  232. end
  233.  
  234. def merge(a, b)
  235. [ [a.first, b.first].min , [a.last, b.last].max ]
  236. end
  237. end
  238.  
  239. store = IntervalStore.new # => []
  240. store.add(1, 2) # => [[1, 2]]
  241. store.add(5, 6) # => [[1, 2], [5, 6]]
  242. store.add(1, 4) # => [[1, 4], [5, 6]]
  243. store.add(1, 2) # => [[1, 4], [5, 6]]
  244. store.add(3, 5) # => [[1, 6]]
  245. store.add(0, 7) # => [[0, 7]]
  246.  
  247. class Interval
  248. attr_reader :left, :right
  249.  
  250. def initialize(left,right)
  251. @left = left
  252. @right = right
  253. end
  254.  
  255. # Is self entirely to the left of other?
  256. def < (other)
  257. self.right < other.left
  258. end
  259.  
  260. # Is self entirely to the right of other?
  261. def > (other)
  262. self.left > other.right
  263. end
  264.  
  265. # Return the lessor of the left end of self and the left end of other
  266. def left_most(other)
  267. [self.left, other.left].min
  268. end
  269.  
  270. # Return the greater of the right end of self and the right end of other
  271. def right_most(other)
  272. [self.right, other.right].max
  273. end
  274.  
  275. # How intervals are to be displayed
  276. def inspect
  277. "#{self.left}..#{self.right}"
  278. end
  279. end
  280.  
  281. class IntervalStore
  282. attr_reader :intervals
  283.  
  284. def initialize
  285. # Array to hold Interval objects
  286. @intervals = []
  287. end
  288.  
  289. def add(left, right)
  290. # Create an Interval object
  291. interval_to_add = Interval.new(left,right)
  292.  
  293. if @intervals.empty?
  294. @intervals = [interval_to_add]
  295. return
  296. end
  297.  
  298. # intervals in @intervals entirely to the left of interval_to_add
  299. before = @intervals.find_all {|i| i < interval_to_add }
  300. # intervals in @intervals entirely to the right of interval_to_add
  301. after = @intervals.find_all {|i| i > interval_to_add }
  302.  
  303. # We will replace all intervals between the before and after
  304. # intervals (if any) with an interval new_interval
  305.  
  306. if (before.size==@intervals.size || after.size==@intervals.size)
  307. # Case where all intervals are to the left of interval_to_add or to the
  308. # right of interval_to_add
  309. new_interval = interval_to_add
  310. else
  311. # before.size is the offset of the left-most interval in @intervals
  312. # that is not in before
  313. # @intervals.size-after.size-1 is the offset of the right-most
  314. # interval in @intervals that is not in after
  315. new_interval = Interval.new(interval_to_add.left_most(@intervals[before.size]),
  316. interval_to_add.right_most(@intervals[@intervals.size-after.size-1]))
  317. end
  318. @intervals = before + [new_interval] + after
  319. end
  320. end
  321.  
  322. is = IntervalStore.new
  323. is.add(2 , 5) #=> [2..5]
  324. is.add(6 , 8) #=> [2..5, 6..8]
  325. is.add(8 ,10) #=> [2..5, 6..10]
  326. is.add(0 , 1) #=> [0..1, 2..5, 6..10]
  327. is.add(1 , 7) #=> [0..10]
  328. is.add(0 , 1) #=> [0..10]
  329. is.add(1 ,11) #=> [0..11]
  330. is.add(-1,10) #=> [-1..11]
  331. is.add(-2,12) #=> [-2..12]
  332.  
  333. Public Class Interval
  334. Private lower As Integer ' LEFT
  335. Private upper As Integer ' RIGHT
  336.  
  337. Public Sub New(_lower As Integer, _upper As Integer)
  338. lower = _lower
  339. upper = _upper
  340. End Sub
  341.  
  342. Public Function lessthan(other As Interval) As Boolean
  343. If (upper < other.lower) Then Return True
  344. Return False
  345. End Function
  346.  
  347. Public Function morethan(other As Interval) As Boolean
  348. If (lower > other.upper) Then Return True
  349. Return False
  350. End Function
  351.  
  352. Public Function leftmost(other As Interval) As Integer
  353. Return Math.Min(lower, other.lower)
  354. End Function
  355.  
  356. Public Function rightmost(other As Interval) As Integer
  357. Return Math.Max(upper, other.upper)
  358. End Function
  359.  
  360. Public Function inspect() As String
  361. If (lower = upper) Then Return lower.ToString Else Return lower.ToString & ".." & upper.ToString
  362. End Function
  363. End Class
  364.  
  365. Public Class IntervalStore
  366. Private intervals As List(Of Interval)
  367.  
  368. Public Sub New()
  369. intervals = New List(Of Interval)
  370. End Sub
  371.  
  372. Public Sub addInterval(lower As Integer, upper As Integer)
  373. Dim interval_to_add As Interval
  374. interval_to_add = New Interval(lower, upper)
  375.  
  376. If (intervals Is Nothing) Then
  377. intervals.Add(interval_to_add)
  378. Return
  379. End If
  380.  
  381. Dim after As List(Of Interval) = intervals.FindAll(Function(i) interval_to_add.lessthan(i))
  382. Dim before As List(Of Interval) = intervals.FindAll(Function(i) interval_to_add.morethan(i))
  383.  
  384. Dim new_interval As Interval
  385. If ((before.Count = intervals.Count) Or (after.Count = intervals.Count)) Then
  386. new_interval = interval_to_add
  387. Else
  388. new_interval = New Interval(interval_to_add.leftmost(intervals(before.Count)), interval_to_add.rightmost(intervals((intervals.Count - after.Count) - 1)))
  389. End If
  390.  
  391. intervals = before
  392. intervals.Add(new_interval)
  393. intervals.AddRange(after)
  394. End Sub
  395.  
  396. Public Function returnValues() As String
  397. Dim sReturn As String = vbNullString
  398. For Each int As Interval In intervals
  399. sReturn = sReturn & (int.inspect) & ","
  400. Next
  401. If (sReturn IsNot Nothing) Then Return sReturn.Trim(","c).Replace(",", ", ") Else Return Nothing
  402. End Function
  403. End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement