From aa54b5eb480962696d49f3e346069ff950ee7989 Mon Sep 17 00:00:00 2001 From: perro Date: Wed, 26 Apr 2023 12:22:05 -0700 Subject: [PATCH] Ejercicio 13 --- .../ex13/__pycache__/sllist.cpython-310.pyc | Bin 0 -> 3938 bytes .../test_sllist.cpython-310-pytest-7.2.2.pyc | Bin 0 -> 10031 bytes exercises/ex13/sllist.py | 138 ++++++++++++++++++ exercises/ex13/test_sllist.py | 97 ++++++++++++ 4 files changed, 235 insertions(+) create mode 100644 exercises/ex13/__pycache__/sllist.cpython-310.pyc create mode 100644 exercises/ex13/__pycache__/test_sllist.cpython-310-pytest-7.2.2.pyc create mode 100644 exercises/ex13/sllist.py create mode 100644 exercises/ex13/test_sllist.py diff --git a/exercises/ex13/__pycache__/sllist.cpython-310.pyc b/exercises/ex13/__pycache__/sllist.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c505ac184485f57e0e9a6f5d19c998a00c66e58 GIT binary patch literal 3938 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 abnVY!L@pqoRt(KBjDm5>D8k1qn*RZ_LSD%L literal 0 HcmV?d00001 diff --git a/exercises/ex13/sllist.py b/exercises/ex13/sllist.py new file mode 100644 index 0000000..17c0e46 --- /dev/null +++ b/exercises/ex13/sllist.py @@ -0,0 +1,138 @@ +class SingleLinkedListNode(object): + + def __init__(self, value): + self.value = value + self.next = None + + def __repr__(self): + nval = self.next and self.next.value or None + return f"[{self.value}:{repr(nval)}]" + + +class SingleLinkedList(object): + def __init__(self): + self.begin = None + self.end = None + + def count(self): + """ + Returns number of items. + Regresa la cantidad de ítems. + """ + count = 0 + node = self.begin + while node: + count += 1 + node = node.next + return count + + def push(self, obj): + """ + Appends a new item on the end of the list. + Añade un nuevo ítem al final de la lista. + """ + node = SingleLinkedListNode(obj) + if self.begin is None: + self.begin = node + self.end = self.begin + else: + self.end.next = node + self.end = node + + def pop(self): + """ + Removes the last item and returns its value. + Remueve el último ítem y regresa su valor. + """ + if self.end is None: + value = None + elif self.end == self.begin: + value = self.end.value + self.end = self.begin = None + else: + node = self.begin + while node.next != self.end: + node = node.next + value = node.next.value + self.end = node + self.end.next = None + return value + + def unshift(self): + """ + Removes the first item and returns its value. + Remueve el primer ítem y regresa su valor. + """ + if self.begin is None: + value = None + elif self.begin == self.end: + value = self.begin.value + self.begin = self.end = None + else: + value = self.begin.value + self.begin = self.begin.next + return value + + def shift(self, obj): + """ + Appends a new item on the begin of the list. + Añade un nuevo ítem al inicio de la lista. + """ + node = SingleLinkedListNode(obj) + if self.begin is None: + self.begin = node + self.end = self.begin + else: + curr, total = 0, self.count() + self.push(node.value) + while curr < total: + self.push(self.unshift()) + curr += 1 + + def remove(self, obj): + """ + Removes a item by its value and return its list index. + Remueve un ítem según su valor y regresa su índice en la lista. + """ + count = 0 + node = self.begin + while node.next: + if obj == node.value: + break + count += 1 + node = node.next + if node.next: + node.value = node.next.value + node.next = node.next.next + else: + node = None + return count + + def get(self, index): + """ + Returns item value at list index. + Regresa el valor del ítem en el índice de la lista. + """ + count = 0 + node = self.begin + while count != index: + count += 1 + node = node.next + if node: + return node.value + else: + return None + + def first(self): + """ + Returns value of first item. + Regresa el valor del primer ítem. + """ + return self.begin.value + + def last(self): + """ + Returns value of last item. + Regresa el valor del último ítem. + """ + return self.end.value diff --git a/exercises/ex13/test_sllist.py b/exercises/ex13/test_sllist.py new file mode 100644 index 0000000..8cda2b3 --- /dev/null +++ b/exercises/ex13/test_sllist.py @@ -0,0 +1,97 @@ +from sllist import * + + +def test_push(): + colors = SingleLinkedList() + colors.push("Pthalo Blue") + assert colors.count() == 1 + colors.push("Ultramarine Blue") + assert colors.count() == 2 + + +def test_pop(): + colors = SingleLinkedList() + colors.push("Magenta") + colors.push("Alizarin") + assert colors.pop() == "Alizarin" + assert colors.count() == 1 + assert colors.pop() == "Magenta" + assert colors.count() == 0 + assert colors.pop() == None + + +def test_get(): + colors = SingleLinkedList() + colors.push("Vermillion") + assert colors.get(0) == "Vermillion" + colors.push("Sap Green") + assert colors.get(0) == "Vermillion" + assert colors.get(1) == "Sap Green" + colors.push("Cadmium Yellow Light") + assert colors.get(0) == "Vermillion" + assert colors.get(1) == "Sap Green" + assert colors.get(2) == "Cadmium Yellow Light" + assert colors.pop() == "Cadmium Yellow Light" + assert colors.get(0) == "Vermillion" + assert colors.get(1) == "Sap Green" + assert colors.get(2) == None + colors.pop() + assert colors.get(0) == "Vermillion" + colors.pop() + assert colors.get(0) == None + + +def test_unshift(): + colors = SingleLinkedList() + colors.push("Viridian") + colors.push("Sap Green") + colors.push("Van Dyke") + assert colors.unshift() == "Viridian" + assert colors.unshift() == "Sap Green" + assert colors.unshift() == "Van Dyke" + assert colors.unshift() == None + assert colors.count() == 0 + + +def test_shift(): + colors = SingleLinkedList() + colors.shift("Cadmium Orange") + assert colors.count() == 1 + colors.shift("Carbazole Violet") + assert colors.count() == 2 + assert colors.pop() == "Cadmium Orange" + assert colors.count() == 1 + assert colors.pop() == "Carbazole Violet" + assert colors.count() == 0 + + +def test_first(): + colors = SingleLinkedList() + colors.push("Cadmium Red Light") + assert colors.first() == "Cadmium Red Light" + colors.push("Hansa Yellow") + assert colors.first() == "Cadmium Red Light" + colors.shift("Pthalo Green") + assert colors.first() == "Pthalo Green" + + +def test_last(): + colors = SingleLinkedList() + colors.push("Cadmium Red Light") + assert colors.last() == "Cadmium Red Light" + colors.push("Hansa Yellow") + assert colors.last() == "Hansa Yellow" + colors.shift("Pthalo Green") + assert colors.last() == "Hansa Yellow" + + +def test_remove(): + colors = SingleLinkedList() + colors.push("Cobalt") + colors.push("Zinc White") + colors.push("Nickle Yellow") + colors.push("Perinone") + assert colors.remove("Cobalt") == 0 + assert colors.remove("Perinone") == 2 + assert colors.remove("Nickle Yellow") == 1 + assert colors.remove("Zinc White") == 0