-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathex-test.py
99 lines (77 loc) · 3.16 KB
/
ex-test.py
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import unittest
from datetime import datetime
from ex import produce_api_calls
# ===================================================
# utils
# ===================================================
DATE_FMT = "%d/%m"
def to_date(s: str) -> datetime:
return datetime.strptime(s, DATE_FMT)
def interval(s: str, v: int, sp: str, dp: str, start: str, end: str) -> dict:
return {"shipment": s,
"vessel": v,
"sp": sp,
"dp": dp,
"start": to_date(start),
"end": to_date(end)}
def api_call(v: int, start: str, end: str) -> dict:
return {"vessel": v,
"start": to_date(start),
"end": to_date(end)}
# ===================================================
# tests
# ===================================================
class MyTestCase(unittest.TestCase):
def test_overlap(self):
intervals = [interval("A", 1, "X", "Y", "1/1", "3/1"),
interval("A", 1, "Y", "Z", "2/1", "6/1"),
interval("B", 1, "Z", "T", "6/1", "7/1"),
interval("C", 1, "T", "U", "9/1", "11/1"),
interval("C", 1, "U", "V", "10/1", "13/1")]
expected = [api_call(1, "1/1", "7/1"),
api_call(1, "9/1", "13/1")]
self.assertEqual(expected, produce_api_calls(intervals))
def test_no_overlap(self):
intervals = [interval("A", 1, "X", "Y", "1/1", "3/1"),
interval("B", 1, "Z", "T", "8/1", "10/1")]
expected = [api_call(1, "1/1", "3/1"),
api_call(1, "8/1", "10/1")]
self.assertEqual(expected, produce_api_calls(intervals))
def test_mix_overlap_non_overlap(self):
intervals = [interval("A", 1, "NY", "ANTWERP", "1/1", "14/1"),
interval("A", 2, "ANTWERP", "HAIFA", "14/1", "20/1"),
interval("B", 2, "ANTWERP", "HAIFA", "14/1", "20/1"),
interval("B", 3, "HAIFA", "ASHDOD", "20/1", "21/1"),
interval("C", 2, "HAIFA", "ANTWERP", "20/1", "26/1"),
interval("D", 3, "ASHDOD", "KOBE", "24/1", "10/2")]
expected = [api_call(1, "1/1", "14/1"),
api_call(2, "14/1", "26/1"),
api_call(3, "20/1", "21/1"),
api_call(3, "24/1", "10/2")]
self.assertEqual(expected, produce_api_calls(intervals))
if __name__ == '__main__':
unittest.main()
# ===================================================
# intuition part
# ===================================================
def try_one():
intervalz = []
inp = [(1, 5), (2, 5), (5, 7), (12, 13), (14, 20)]
inp = sorted(inp, key=lambda x: x[0])
intervalz.append(inp[0])
inp = inp[1:]
for A2, B2 in inp:
A1, B1 = intervalz[-1]
A2_in = A1 <= A2 <= B1
B2_in = A1 <= B2 <= B1
if A2_in and B2_in:
continue
if A2_in and not B2_in:
intervalz.pop()
intervalz.append((A1, B2))
if not A2_in and B2_in:
intervalz.pop()
intervalz.append((A2, B1))
if not A2_in and not B2_in:
intervalz.append((A2, B2))
return intervalz