Skip to content

Commit b12a64b

Browse files
committed
Added Workshop/hashmap and Workshop/inventory
1 parent 5026733 commit b12a64b

File tree

6 files changed

+485
-0
lines changed

6 files changed

+485
-0
lines changed

OOP/D.Workshop/# TODO.txt

Whitespace-only changes.

OOP/D.Workshop/hashmap/hash_table.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
class HashTable:
2+
3+
def __init__(self):
4+
self.__max_capacity = 4
5+
self.__keys = [None] * self.__max_capacity
6+
self.__values = [None] * self.__max_capacity
7+
8+
def __getitem__(self, key):
9+
try:
10+
index = self.__keys.index(key)
11+
return self.__values[index]
12+
except ValueError:
13+
raise KeyError(f"\"{key}\" key not found!")
14+
15+
def __setitem__(self, key, value):
16+
if key in self.__keys:
17+
index = self.__keys.index(key)
18+
self.__values[index] = value
19+
return
20+
21+
if len(self) == self.__max_capacity:
22+
self.__resize()
23+
24+
index = self.__calc_index(key)
25+
index = self.__get_index(index)
26+
27+
self.__keys[index] = key
28+
self.__values[index] = value
29+
30+
def __calc_index(self, key):
31+
return sum(ord(c) for c in key) % self.__max_capacity
32+
33+
def __get_index(self, index):
34+
if index == self.__max_capacity:
35+
index = 0
36+
37+
if self.__keys[index] is None:
38+
return index
39+
40+
return self.__get_index(index + 1)
41+
42+
def __resize(self):
43+
self.__keys = self.__keys + [None] * self.__max_capacity
44+
self.__values = self.__values + [None] * self.__max_capacity
45+
self.__max_capacity *= 2
46+
47+
def __len__(self):
48+
return len([k for k in self.__keys if k is not None])
49+
50+
def add(self, key, value):
51+
self[key] = value
52+
53+
def get(self, key, default=None):
54+
try:
55+
return self[key]
56+
except KeyError:
57+
return default
58+
59+
def get_representation(self):
60+
print("{", end="")
61+
62+
for i in range(self.__max_capacity):
63+
key = self.__keys[i]
64+
65+
if key is not None:
66+
print(f"{key}: {self.__values[i]},", end=" ")
67+
68+
print("}")
69+
70+
71+
table = HashTable()
72+
73+
table["name"] = "Peter"
74+
table["name"] = "Dimitar"
75+
table["age"] = 16
76+
table["is_pet_owner"] = True
77+
table["is_driver"] = False
78+
79+
table.add("a", "A")
80+
81+
print(table.get("b", "This is not a valid key"))
82+
83+
table.get_representation()
84+
85+
print(table)
86+
print(table.get("name"))
87+
print(table["age"])
88+
print(len(table))
Binary file not shown.
Binary file not shown.

OOP/D.Workshop/inventory/inventory.py

Lines changed: 300 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,300 @@
1+
class Inventory:
2+
3+
def __init__(self, *args):
4+
self.__inventory = {}
5+
self.__negative_indexes = {}
6+
7+
for index, item in enumerate(args):
8+
self.__inventory[index] = item
9+
10+
for index, item in enumerate(args[::-1]):
11+
index -= (1 + index + index)
12+
self.__negative_indexes[index] = item
13+
14+
def __getitem__(self, index):
15+
try:
16+
if index < 0:
17+
return self.__negative_indexes[index]
18+
return self.__inventory[index]
19+
except KeyError:
20+
raise IndexError("Index out of range!")
21+
22+
def __get_last_index(self):
23+
return len(self.__inventory) - 1
24+
25+
def __append_to_negative_indexes(self, value):
26+
new_indexes = {-1: value}
27+
for key, value in self.__negative_indexes.items():
28+
new_indexes[key-1] = value
29+
return new_indexes
30+
31+
def append(self, value):
32+
index = 1 + self.__get_last_index()
33+
self.__inventory[index] = value
34+
self.__negative_indexes = self.__append_to_negative_indexes(value)
35+
36+
def extend(self, iterable):
37+
for char in iterable:
38+
self.append(char)
39+
40+
def insert(self, index, value):
41+
if index < 0:
42+
new_indexes = {}
43+
for key, v in self.__negative_indexes.items():
44+
if key == index:
45+
new_indexes[index] = value
46+
if key <= index:
47+
new_indexes[key-1] = v
48+
else:
49+
new_indexes[key] = v
50+
self.__negative_indexes = new_indexes
51+
52+
num = 0
53+
new_inventory_indexes = {}
54+
for value in self.__negative_indexes.values().__reversed__():
55+
new_inventory_indexes[num] = value
56+
num += 1
57+
self.__inventory = new_inventory_indexes
58+
return None
59+
60+
new_indexes = {}
61+
for key, v in self.__inventory.items():
62+
if key == index:
63+
new_indexes[index] = value
64+
if key >= index:
65+
new_indexes[key+1] = v
66+
else:
67+
new_indexes[key] = v
68+
self.__inventory = new_indexes
69+
70+
num = -1
71+
new_negative_indexes = {}
72+
for value in self.__inventory.values().__reversed__():
73+
new_negative_indexes[num] = value
74+
num -= 1
75+
self.__negative_indexes = new_negative_indexes
76+
77+
def add_first(self, value):
78+
return self.insert(0, value)
79+
80+
def __remove_from_negative_indexes(self, index):
81+
length = len(self.__negative_indexes)
82+
length -= index
83+
84+
if length <= 0:
85+
raise IndexError("Index out of range!")
86+
87+
del self.__negative_indexes[-length]
88+
89+
return self.__update_negative_indexes()
90+
91+
def __remove_from_inventory(self, index):
92+
length = len(self.__inventory)
93+
length -= abs(index)
94+
95+
if length < 0:
96+
raise IndexError("Index out of range!")
97+
98+
del self.__inventory[length]
99+
100+
return self.__update_inventory_indexes()
101+
102+
def __update_negative_indexes(self):
103+
new_indexes = {}
104+
num = -1
105+
for key, value in self.__negative_indexes.items():
106+
new_indexes[num] = value
107+
num -= 1
108+
109+
return new_indexes
110+
111+
def __update_inventory_indexes(self):
112+
new_indexes = {}
113+
num = 0
114+
for key, value in self.__inventory.items():
115+
key = num
116+
new_indexes[key] = value
117+
num += 1
118+
119+
return new_indexes
120+
121+
def remove(self, index):
122+
try:
123+
if index < 0:
124+
value = self.__negative_indexes[index]
125+
del self.__negative_indexes[index]
126+
self.__negative_indexes = self.__update_negative_indexes()
127+
self.__inventory = self.__remove_from_inventory(index)
128+
return value
129+
130+
value = self.__inventory[index]
131+
del self.__inventory[index]
132+
self.__inventory = self.__update_inventory_indexes()
133+
self.__negative_indexes = self.__remove_from_negative_indexes(index)
134+
return value
135+
136+
except KeyError:
137+
raise IndexError("Index out of range!")
138+
139+
def clear(self):
140+
self.__inventory = {}
141+
self.__negative_indexes = {}
142+
143+
def pop(self, index=-1):
144+
return self.remove(index)
145+
146+
def index(self, value):
147+
if value in self.__inventory.values():
148+
for k, v in self.__inventory.items():
149+
if v == value:
150+
return k
151+
else:
152+
raise ValueError("Value not found!")
153+
154+
def get(self, index):
155+
if index < 0:
156+
return self.__negative_indexes[index]
157+
return self.__inventory[index]
158+
159+
def count(self, value):
160+
times = 0
161+
for v in self.__inventory.values():
162+
if v == value:
163+
times += 1
164+
return times
165+
166+
def reverse(self):
167+
return Inventory(*self.__inventory.values().__reversed__())
168+
169+
def copy(self):
170+
return Inventory(*self.__inventory.values())
171+
172+
def size(self):
173+
return len(self.__inventory)
174+
175+
@staticmethod
176+
def isnum(element):
177+
if isinstance(element, int) or isinstance(element, float):
178+
return True
179+
return False
180+
181+
@staticmethod
182+
def isstring(element):
183+
if isinstance(element, str):
184+
return True
185+
return False
186+
187+
@staticmethod
188+
def isbool(element):
189+
if isinstance(element, bool):
190+
return True
191+
return False
192+
193+
@staticmethod
194+
def islist(element):
195+
if isinstance(element, list) or isinstance(element, tuple):
196+
return True
197+
return False
198+
199+
@staticmethod
200+
def isInventory(obj):
201+
if isinstance(obj, Inventory):
202+
return True
203+
return False
204+
205+
def sum(self):
206+
total_sum = 0
207+
for element in self.__inventory.values():
208+
if Inventory.isnum(element):
209+
total_sum += element
210+
elif Inventory.isstring(element):
211+
total_sum += len(element)
212+
elif Inventory.isbool(element):
213+
continue
214+
else:
215+
raise ValueError(f"{element} cannot be summed!")
216+
217+
return total_sum
218+
219+
def __dict__(self):
220+
return self.__inventory
221+
222+
# def test(self):
223+
# return self.__inventory
224+
225+
# def test_2(self):
226+
# return self.__negative_indexes
227+
228+
def __str__(self):
229+
return '[' + ', '.join([str(char) if type(char) != str else f"\'{char}\'" for char in self.__inventory.values()]) + ']'
230+
231+
232+
inventory = Inventory(1, 2, -6, 3, 4, 5, 6, 7, 8, 9, 10, "Gorge", True, False)
233+
234+
print(inventory) # [1, 2, -6, 3, 4, 5, 6, 7, 8, 9, 10, "Gorge", True, False]
235+
print(inventory[3]) # 3
236+
print(inventory[-3]) # Gorge
237+
print()
238+
try:
239+
print(inventory[:5])
240+
except:
241+
print("Cannot slice")
242+
print()
243+
try:
244+
print(inventory[1287])
245+
except:
246+
pass
247+
print()
248+
inventory.append("Seven")
249+
print(inventory[-1]) # Seven
250+
print()
251+
inventory.extend([[1, 2, 3], [1, 3, 2]])
252+
print(inventory[-1]) # [1, 3, 2]
253+
print()
254+
inventory.insert(3, "8")
255+
print(inventory) # [1, 2, -6, "8", 3, 4, 5, 6, 7, 8, 9, 10, "Gorge", True, False, "Seven", [1, 2, 3], [1, 3, 2]]
256+
257+
inventory.add_first(0)
258+
259+
print(inventory)
260+
# print(inventory.test_2())
261+
262+
print(inventory[0]) # 0
263+
264+
inventory.remove(0)
265+
266+
print(inventory)
267+
# print(inventory.test_2())
268+
269+
print(inventory[0]) # 1
270+
271+
print(inventory.pop()) # [1, 3, 2]
272+
273+
print(inventory)
274+
# print(inventory.test_2())
275+
276+
print(inventory[-1]) # [1, 2, 3]
277+
278+
print(inventory.index(1)) # 0
279+
280+
print(inventory.get(2)) # -6
281+
282+
print(inventory.count("Gorge")) # 1
283+
284+
inventory = Inventory(3, 2, 1)
285+
print(inventory.reverse()) # [1, 2, 3]
286+
print(inventory) # [3, 2, 1]
287+
288+
inventory_copy = inventory.copy()
289+
print(inventory != inventory_copy) # True
290+
291+
inventory_copy.append(1)
292+
print(inventory.size()) # 3
293+
294+
inventory = Inventory(1, "23", 4)
295+
print(inventory.sum()) # 7
296+
297+
print(inventory.__dict__()) # {0: 1, 1: "23", 2: 4}
298+
299+
inventory.clear()
300+
print(inventory) # []

0 commit comments

Comments
 (0)