-
Notifications
You must be signed in to change notification settings - Fork 0
/
Dynamic_array.py
172 lines (134 loc) · 4.39 KB
/
Dynamic_array.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
from math import ceil
class DynamicArray(object):
def __init__(self, capacity=1, grow_factor=0.2):
self.length = 0 # Actual number of elements in dynamic array
self.capacity = capacity # Initialize chunk of memory size to 1
self.grow_factor = grow_factor # grow_factor is set to 1.2
self.chunk = [None] * self.capacity # Allocate initialized blocks
def add_element(self, element):
if element is not None and type(element) != int:
return 'Input data must be int or None, please check it'
if self.length == self.capacity:
add_chunk_size = ceil(self.capacity * self.grow_factor)
self.chunk += [None] * add_chunk_size
self.capacity = self.capacity + add_chunk_size
self.chunk[self.length] = element
self.length += 1
def __eq__(self, other): # Check A is equality to B
assert type(other) == DynamicArray
if self.length != other.length:
return False
else:
for i in range(self.length):
if self.chunk[i] != other.chunk[i]:
return False
return True
def __str__(self): # String serialization
return str(self.chunk[:self.length])
def cons(lst, element=None):
if type(lst) is int and type(element) == DynamicArray:
res = cons(element, lst)
else:
assert type(lst) == DynamicArray
res = DynamicArray()
for i in range(lst.length):
res.add_element(lst.chunk[i])
res.add_element(element)
return res
def remove(lst, value=None):
assert type(lst) == DynamicArray
if value < 0 or value >= lst.length:
return 'The location accessed is not in the dynamic array'
res = DynamicArray()
for i in range(lst.length):
if i != value:
res.add_element(lst.chunk[i])
return res
def length(lst):
assert type(lst) == DynamicArray
return lst.length
def member(lst, v):
assert type(lst) == DynamicArray
if v not in lst.chunk[:lst.length]:
return False
else:
return True
def reverse(lst):
assert type(lst) == DynamicArray
res = DynamicArray()
for i in range(lst.length):
res.add_element(lst.chunk[lst.length-i-1])
return res
def to_list(lst):
assert type(lst) == DynamicArray
res = []
for i in range(lst.length):
res.append(lst.chunk[i])
return res
def from_list(lst):
assert type(lst) == list
res = DynamicArray()
for i in lst:
res.add_element(i)
return res
def find(lst, function):
assert callable(function)
for i in lst.chunk:
if function(i):
return True
return False
def filter(lst, function):
assert callable(function)
res = DynamicArray()
for i in range(lst.length):
if function(lst.chunk[i]):
res.add_element(lst.chunk[i])
return res
def map(lst, function):
assert type(lst) == DynamicArray
assert callable(function)
res = DynamicArray()
for i in range(lst.length):
res.add_element(function(lst.chunk[i]))
return res
def reduce(lst, function, initial_state):
assert type(lst) == DynamicArray
assert callable(function)
assert type(initial_state) == int
state = initial_state
for i in range(lst.length):
if lst.chunk[i] is not None:
state = function(state, lst.chunk[i])
return state
def iterator(lst):
length = lst.length
res = lst
index = 0
def foo():
nonlocal res
nonlocal length
nonlocal index
if (index >= length) | (res is None):
raise StopIteration
tmp = res.chunk[index]
index = index+1
return tmp
return foo
def empty():
return DynamicArray
def concat(lst1, lst2):
assert type(lst1) == DynamicArray
res = DynamicArray()
for i in range(lst1.length):
res.add_element(lst1.chunk[i])
for j in range(lst2.length):
res.add_element(lst2.chunk[j])
return res
def eq(lst1, lst2):
assert type(lst1) == DynamicArray
assert type(lst2) == DynamicArray
return lst1.__eq__(lst2)
def str1(lst):
assert type(lst) == DynamicArray
res = str(lst.chunk[:lst.length])
return res