From 81d0493fcce03a03782e73e929e55a99f2c6a4d4 Mon Sep 17 00:00:00 2001 From: Oliver Abreu Date: Sat, 26 Sep 2020 12:12:46 -0400 Subject: [PATCH 1/5] feat(README.md): Initial commit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7468701de..1972eb0e9 100644 --- a/README.md +++ b/README.md @@ -96,3 +96,4 @@ While credit will be given for a functional solution, only optimal solutions wil #### Passing the Sprint Score ranges for a 1, 2, and 3 are shown in the rubric above. For a student to have _passed_ a sprint challenge, they need to earn an **at least 2** for all items on the rubric. + \ No newline at end of file From 8915c8db819e9d286bcbb0637d686cb0f1316ed2 Mon Sep 17 00:00:00 2001 From: Oliver Abreu Date: Sat, 26 Sep 2020 12:28:02 -0400 Subject: [PATCH 2/5] feat(ring_buffer.py): Creates init method --- ring_buffer/ring_buffer.py | 4 +- ring_buffer/test_ring_buffer.py | 76 ++++++++++++++++----------------- 2 files changed, 41 insertions(+), 39 deletions(-) diff --git a/ring_buffer/ring_buffer.py b/ring_buffer/ring_buffer.py index 37e9fb0dd..ecc3cfbbd 100644 --- a/ring_buffer/ring_buffer.py +++ b/ring_buffer/ring_buffer.py @@ -1,6 +1,8 @@ class RingBuffer: def __init__(self, capacity): - pass + self.capacity = capacity + self.current_index = 0 + self.value = capacity def append(self, item): pass diff --git a/ring_buffer/test_ring_buffer.py b/ring_buffer/test_ring_buffer.py index 31e1f247d..5b14a239a 100644 --- a/ring_buffer/test_ring_buffer.py +++ b/ring_buffer/test_ring_buffer.py @@ -9,44 +9,44 @@ def setUp(self): def test_new_buffer_has_appropriate_capacity(self): self.assertEqual(self.buffer.capacity, self.capacity) - def test_adding_one_element_to_buffer(self): - self.buffer.append('a') - self.assertEqual(self.buffer.get(), ['a']) - - def test_filling_buffer_to_capacity(self): - self.buffer.append('a') - self.buffer.append('b') - self.buffer.append('c') - self.buffer.append('d') - self.buffer.append('e') - self.assertEqual(self.buffer.get(), ['a', 'b', 'c', 'd', 'e']) - - def test_adding_one_element_to_full_buffer(self): - self.buffer.append('a') - self.buffer.append('b') - self.buffer.append('c') - self.buffer.append('d') - self.buffer.append('e') - self.buffer.append('f') - self.assertEqual(self.buffer.get(), ['f', 'b', 'c', 'd', 'e']) - - def test_adding_many_elements_to_full_buffer(self): - self.buffer.append('a') - self.buffer.append('b') - self.buffer.append('c') - self.buffer.append('d') - self.buffer.append('e') - self.buffer.append('f') - self.buffer.append('g') - self.buffer.append('h') - self.buffer.append('i') - self.assertEqual(self.buffer.get(), ['f', 'g', 'h', 'i', 'e']) - - def test_adding_50_elements_to_buffer(self): - for i in range(50): - self.buffer.append(i) - - self.assertEqual(self.buffer.get(), [45, 46, 47, 48, 49]) + # def test_adding_one_element_to_buffer(self): + # self.buffer.append('a') + # self.assertEqual(self.buffer.get(), ['a']) + + # def test_filling_buffer_to_capacity(self): + # self.buffer.append('a') + # self.buffer.append('b') + # self.buffer.append('c') + # self.buffer.append('d') + # self.buffer.append('e') + # self.assertEqual(self.buffer.get(), ['a', 'b', 'c', 'd', 'e']) + + # def test_adding_one_element_to_full_buffer(self): + # self.buffer.append('a') + # self.buffer.append('b') + # self.buffer.append('c') + # self.buffer.append('d') + # self.buffer.append('e') + # self.buffer.append('f') + # self.assertEqual(self.buffer.get(), ['f', 'b', 'c', 'd', 'e']) + + # def test_adding_many_elements_to_full_buffer(self): + # self.buffer.append('a') + # self.buffer.append('b') + # self.buffer.append('c') + # self.buffer.append('d') + # self.buffer.append('e') + # self.buffer.append('f') + # self.buffer.append('g') + # self.buffer.append('h') + # self.buffer.append('i') + # self.assertEqual(self.buffer.get(), ['f', 'g', 'h', 'i', 'e']) + + # def test_adding_50_elements_to_buffer(self): + # for i in range(50): + # self.buffer.append(i) + + # self.assertEqual(self.buffer.get(), [45, 46, 47, 48, 49]) if __name__ == '__main__': unittest.main() \ No newline at end of file From 8d7b86d3727485dae110c166f469d19b0154546e Mon Sep 17 00:00:00 2001 From: Oliver Abreu Date: Sat, 26 Sep 2020 13:43:19 -0400 Subject: [PATCH 3/5] feat(ring_buffer.py): Completed append and get functions; passes tests --- ring_buffer/ring_buffer.py | 14 ++++-- ring_buffer/test_ring_buffer.py | 76 ++++++++++++++++----------------- 2 files changed, 49 insertions(+), 41 deletions(-) diff --git a/ring_buffer/ring_buffer.py b/ring_buffer/ring_buffer.py index ecc3cfbbd..10dbefda3 100644 --- a/ring_buffer/ring_buffer.py +++ b/ring_buffer/ring_buffer.py @@ -2,10 +2,18 @@ class RingBuffer: def __init__(self, capacity): self.capacity = capacity self.current_index = 0 - self.value = capacity + self.storage = [] def append(self, item): - pass + """ + When buffer is full, place the value of `item` at the current index; + otherwise, append the item to the end of the buffer + """ + if len(self.storage) == self.capacity: + self.storage[self.current_index] = item + self.current_index = (self.current_index + 1) % self.capacity + else: + self.storage.append(item) def get(self): - pass \ No newline at end of file + return self.storage \ No newline at end of file diff --git a/ring_buffer/test_ring_buffer.py b/ring_buffer/test_ring_buffer.py index 5b14a239a..31e1f247d 100644 --- a/ring_buffer/test_ring_buffer.py +++ b/ring_buffer/test_ring_buffer.py @@ -9,44 +9,44 @@ def setUp(self): def test_new_buffer_has_appropriate_capacity(self): self.assertEqual(self.buffer.capacity, self.capacity) - # def test_adding_one_element_to_buffer(self): - # self.buffer.append('a') - # self.assertEqual(self.buffer.get(), ['a']) - - # def test_filling_buffer_to_capacity(self): - # self.buffer.append('a') - # self.buffer.append('b') - # self.buffer.append('c') - # self.buffer.append('d') - # self.buffer.append('e') - # self.assertEqual(self.buffer.get(), ['a', 'b', 'c', 'd', 'e']) - - # def test_adding_one_element_to_full_buffer(self): - # self.buffer.append('a') - # self.buffer.append('b') - # self.buffer.append('c') - # self.buffer.append('d') - # self.buffer.append('e') - # self.buffer.append('f') - # self.assertEqual(self.buffer.get(), ['f', 'b', 'c', 'd', 'e']) - - # def test_adding_many_elements_to_full_buffer(self): - # self.buffer.append('a') - # self.buffer.append('b') - # self.buffer.append('c') - # self.buffer.append('d') - # self.buffer.append('e') - # self.buffer.append('f') - # self.buffer.append('g') - # self.buffer.append('h') - # self.buffer.append('i') - # self.assertEqual(self.buffer.get(), ['f', 'g', 'h', 'i', 'e']) - - # def test_adding_50_elements_to_buffer(self): - # for i in range(50): - # self.buffer.append(i) - - # self.assertEqual(self.buffer.get(), [45, 46, 47, 48, 49]) + def test_adding_one_element_to_buffer(self): + self.buffer.append('a') + self.assertEqual(self.buffer.get(), ['a']) + + def test_filling_buffer_to_capacity(self): + self.buffer.append('a') + self.buffer.append('b') + self.buffer.append('c') + self.buffer.append('d') + self.buffer.append('e') + self.assertEqual(self.buffer.get(), ['a', 'b', 'c', 'd', 'e']) + + def test_adding_one_element_to_full_buffer(self): + self.buffer.append('a') + self.buffer.append('b') + self.buffer.append('c') + self.buffer.append('d') + self.buffer.append('e') + self.buffer.append('f') + self.assertEqual(self.buffer.get(), ['f', 'b', 'c', 'd', 'e']) + + def test_adding_many_elements_to_full_buffer(self): + self.buffer.append('a') + self.buffer.append('b') + self.buffer.append('c') + self.buffer.append('d') + self.buffer.append('e') + self.buffer.append('f') + self.buffer.append('g') + self.buffer.append('h') + self.buffer.append('i') + self.assertEqual(self.buffer.get(), ['f', 'g', 'h', 'i', 'e']) + + def test_adding_50_elements_to_buffer(self): + for i in range(50): + self.buffer.append(i) + + self.assertEqual(self.buffer.get(), [45, 46, 47, 48, 49]) if __name__ == '__main__': unittest.main() \ No newline at end of file From 812bb316ada7104894ef75f6b867e8e8d231eb3f Mon Sep 17 00:00:00 2001 From: Oliver Abreu Date: Sat, 26 Sep 2020 13:47:30 -0400 Subject: [PATCH 4/5] feat(reverse.py): Creates reverse_list method --- reverse/reverse.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/reverse/reverse.py b/reverse/reverse.py index 6116252d1..ca6c69e6c 100644 --- a/reverse/reverse.py +++ b/reverse/reverse.py @@ -39,4 +39,12 @@ def contains(self, value): return False def reverse_list(self, node, prev): - pass + self.prev = None + current = self.head + + while current is not None: + next_node = current.next_node + current.next_node = prev + prev = current + current = next_node + self.head = prev From 0bbaaa962da60d3d2e281975091bb1d0e4346f43 Mon Sep 17 00:00:00 2001 From: Oliver Abreu Date: Sat, 26 Sep 2020 14:33:16 -0400 Subject: [PATCH 5/5] feat(names.py) Replaces nested loops with BST --- names/binary_search_tree.py | 31 +++++++++++++++++++++++++++++++ names/names.py | 15 +++++++++------ 2 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 names/binary_search_tree.py diff --git a/names/binary_search_tree.py b/names/binary_search_tree.py new file mode 100644 index 000000000..cc21b1e66 --- /dev/null +++ b/names/binary_search_tree.py @@ -0,0 +1,31 @@ +class BSTNode: + def __init__(self, value): + self.value = value + self.left = None + self.right = None + + def insert(self, value): + if value < self.value: + if self.left is None: + self.left = BSTNode(value) + else: + self.left.insert(value) + else: + if self.right is None: + self.right = BSTNode(value) + else: + self.right.insert(value) + + def contains(self, value): + if self.value == value: + return True + if value < self.value: + if not self.left: + return False + else: + return self.left.contains(value) + else: + if not self.right: + return False + else: + return self.right.contains(value) \ No newline at end of file diff --git a/names/names.py b/names/names.py index ea158997f..bbb689970 100644 --- a/names/names.py +++ b/names/names.py @@ -1,22 +1,25 @@ import time +from binary_search_tree import BSTNode start_time = time.time() -f = open('names_1.txt', 'r') +f = open('./names/names_1.txt', 'r') names_1 = f.read().split("\n") # List containing 10000 names f.close() -f = open('names_2.txt', 'r') +f = open('./names/names_2.txt', 'r') names_2 = f.read().split("\n") # List containing 10000 names f.close() duplicates = [] # Return the list of duplicates in this data structure # Replace the nested for loops below with your improvements -for name_1 in names_1: - for name_2 in names_2: - if name_1 == name_2: - duplicates.append(name_1) +search_tree = BSTNode("None") +for name in names_1: + search_tree.insert(name) +for name in names_2: + if search_tree.contains(name): + duplicates.append(name) end_time = time.time() print (f"{len(duplicates)} duplicates:\n\n{', '.join(duplicates)}\n\n")