aboutsummaryrefslogtreecommitdiff
path: root/challenge-092/paulo-custodio/python/ch-2.py
blob: 70338a0976c6568aa2399e72098904c53c20bfeb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/env python

# Challenge 092
#
# TASK #2 > Insert Interval
# Submitted by: Mohammad S Anwar
# You are given a set of sorted non-overlapping intervals and a new interval.
#
# Write a script to merge the new interval to the given set of intervals.
#
# Example 1:
# Input $S = (1,4), (8,10); $N = (2,6)
# Output: (1,6), (8,10)
# Example 2:
# Input $S = (1,2), (3,7), (8,10); $N = (5,8)
# Output: (1,2), (3,10)
# Example 3:
# Input $S = (1,5), (7,9); $N = (10,11)
# Output: (1,5), (7,9), (10,11)

import sys

def add_interval_in_order(intervals, a, b):
    if len(intervals)==0:
        intervals.append([a, b])
    else:
        for i in range(0, len(intervals)):
            if b < intervals[i][0]:                 # before, not overlapping
                intervals = intervals[:i]+[a, b]+intervals[i:]
                return intervals
            elif b >= intervals[i][0] and b < intervals[i][1]:  # end within
                if a < intervals[i][0]:                         # merge start
                    intervals[i][0] = a
                return intervals
            elif b >= intervals[i][1] and a < intervals[i][1]:  # end after, start within
                intervals[i][1] = b
                if a < intervals[i][0]:                         # merge start
                    intervals[i][0] = a
                return intervals
        intervals.append([a, b])                                # append to end
    return intervals

def merge_intervals(intervals):
    i = 0
    while i+1 < len(intervals):
        while i+1 < len(intervals):
            this = intervals[i]
            next = intervals[i+1]
            if this[1] < next[0]:       # not overlapping
                break                   # next interval
            else:
                intervals = intervals[:i]+ \
                            [[this[0], next[1]]]+ \
                            intervals[i+2:]     # merge and test again
        i += 1
    return intervals

def add_interval(intervals, a, b):
    intervals = add_interval_in_order(intervals, a, b)
    intervals = merge_intervals(intervals)
    return intervals

def add_intervals():
    intervals = []
    for i in range(1, len(sys.argv)):
        a, b = sys.argv[i].split(',')
        intervals = add_interval(intervals, int(a), int(b))
    return intervals

def intervals_str(intervals):
    out = ''
    for i in range(0, len(intervals)):
        out += '('+str(intervals[i][0])+','+str(intervals[i][1])+')'
        if i<len(intervals)-1:
            out += ', '
    return out

print(intervals_str(add_intervals()))