From 929cf36383f0a43c5537afda6aa35f26a0bcf07f Mon Sep 17 00:00:00 2001 From: Samuel Shuert Date: Fri, 3 Oct 2025 13:56:10 +0000 Subject: [PATCH] feat: oct 3 level 1 --- python/oct3/level1/isPalindromicList.py | 28 +++++++++++++++ python/oct3/level1/isRotation.py | 24 +++++++++++++ python/oct3/level1/median.py | 34 ++++++++++++++++++ python/oct3/level1/missingValue.py | 46 +++++++++++++++++++++++++ python/oct3/level1/sortedEvens.py | 20 +++++++++++ 5 files changed, 152 insertions(+) create mode 100644 python/oct3/level1/isPalindromicList.py create mode 100644 python/oct3/level1/isRotation.py create mode 100644 python/oct3/level1/median.py create mode 100644 python/oct3/level1/missingValue.py create mode 100644 python/oct3/level1/sortedEvens.py diff --git a/python/oct3/level1/isPalindromicList.py b/python/oct3/level1/isPalindromicList.py new file mode 100644 index 0000000..2dd7f2e --- /dev/null +++ b/python/oct3/level1/isPalindromicList.py @@ -0,0 +1,28 @@ +from typing import Sequence + + +def isPalindromicList(L: Sequence) -> bool: + """Check if a list is palindromic.""" + for i in range(len(L) // 2): + if L[i] != L[-i - 1]: + return False + return True + + +print("Testing isPalindromicList()...", end="") +assert isPalindromicList([1, 2, 2, 1]) == True +assert isPalindromicList([1, 2, 3, 1]) == False +assert isPalindromicList([1]) == True +assert isPalindromicList([5.0, -1, True, "hey", True, -1, 5.0]) == True +assert isPalindromicList([0, "hi", False, False, 4.0]) == False +assert isPalindromicList([]) == True + +# Verify function is non-mutating +L = [1, 2, 1] +assert isPalindromicList(L) == True +assert L == [1, 2, 1] + +L = [1, 9, 8] +assert isPalindromicList(L) == False +assert L == [1, 9, 8] +print("Passed!") diff --git a/python/oct3/level1/isRotation.py b/python/oct3/level1/isRotation.py new file mode 100644 index 0000000..e50a422 --- /dev/null +++ b/python/oct3/level1/isRotation.py @@ -0,0 +1,24 @@ +from typing import Sequence + + +def isRotation(L: Sequence, M: Sequence) -> bool: + """Check if M is a rotation of L.""" + L = list(L) + M = list(M) + if not len(L) == len(M): + return False + if not L and not M: + return True + for i in range(len(L)): + if L[i:] + L[:i] == M: + return True + return False + + +print("Testing isRotation()...", end="") +assert isRotation([2, 3, 4, 5, 6], [4, 5, 6, 2, 3]) == True +assert isRotation([2, 3, 4, 5, 6], [2, 3, 4, 5, 6]) == True +assert isRotation([2, 3, 4, 5, 6], [2, 4, 3, 5, 6]) == False +assert isRotation([1], []) == False +assert isRotation([], []) == True +print("Passed!") diff --git a/python/oct3/level1/median.py b/python/oct3/level1/median.py new file mode 100644 index 0000000..132cd1b --- /dev/null +++ b/python/oct3/level1/median.py @@ -0,0 +1,34 @@ +from typing import Sequence + + +def almostEqual(x, y): + return abs(x - y) < 10**-9 + + +def median(L: Sequence[float]) -> float | None: + """Return the median of a sequence of numbers.""" + L = list(L) + if not len(L): + return None + L.sort() + mid = len(L) // 2 + if len(L) % 2 == 1: + return L[mid] + else: + return (L[mid - 1] + L[mid]) / 2 + + +print("Testing median()...", end="") +assert median([42]) == 42 +assert almostEqual(median([1, 2]), 1.5) +assert median([-1.7, 3, -2, 4.2, 2]) == 2 +assert median([2, 3, 2, 4, 2]) == 2 +assert almostEqual(median([2, 3, 2, 4, 2, 3]), 2.5) +assert median([]) == None + +# Verify function is non-mutating +L = [1, 3, 2] +assert median(L) == 2 +assert L == [1, 3, 2] + +print("Passed!") diff --git a/python/oct3/level1/missingValue.py b/python/oct3/level1/missingValue.py new file mode 100644 index 0000000..7c3439d --- /dev/null +++ b/python/oct3/level1/missingValue.py @@ -0,0 +1,46 @@ +from typing import Sequence, TypeVar + + +T = TypeVar("T", bound=str | float) + + +def missingValue(L: Sequence[T], M: Sequence[T]) -> T | None: + """Return the missing value from one of the two sorted sequences.""" + if (not L) and M: + return M[0] + elif (not M) and L: + return L[0] + elif (not L) and (not M): + return None + L = sorted(L) + M = sorted(M) + larger = L if len(L) > len(M) else M + smaller = L if len(L) < len(M) else M + for i in range(len(larger)): + a = larger[i] + if i > (len(smaller) - 1): + return a + b = smaller[i] + if a != b: + return larger[i] + return None + + +print("Testing missingValue()...", end="") +assert missingValue([1, 2, 3], [3, 1]) == 2 +assert missingValue([1, 2, 3], [2, 1]) == 3 +assert missingValue(["A", "B", "A", "C"], ["C", "A", "B"]) == "A" +assert missingValue(["A", "B", "A", "C"], ["A", "A", "B"]) == "C" +assert missingValue(["A", "B", "A", "C"], ["A", "C", "A"]) == "B" +assert missingValue([2, 2], [2]) == 2 +assert missingValue([2, 3], [2]) == 3 +assert missingValue([2, 3], [3]) == 2 +assert missingValue(["amazing"], []) == "amazing" + +# Make sure the function is non-mutating +L = [1, 2, 3] +M = [3, 1] +assert missingValue(L, M) == 2 +assert L == [1, 2, 3] +assert M == [3, 1] +print("Passed!") diff --git a/python/oct3/level1/sortedEvens.py b/python/oct3/level1/sortedEvens.py new file mode 100644 index 0000000..630a578 --- /dev/null +++ b/python/oct3/level1/sortedEvens.py @@ -0,0 +1,20 @@ +from typing import Sequence + + +def sortedEvens(L: Sequence[int]) -> Sequence[int]: + """Return a sorted list of even numbers from the input sequence.""" + return sorted([x for x in L if x % 2 == 0]) + + +print("Testing sortedEvens()...", end="") +assert sortedEvens([1, 4, 3, 2, 5]) == [2, 4] +assert sortedEvens([1, 3, 2, 5]) == [2] +assert sortedEvens([6, 4, -2, 8, 4, 0, 9]) == [-2, 0, 4, 4, 6, 8] +assert sortedEvens([1, 3, 5]) == [] +assert sortedEvens([]) == [] + +# confirm this is non-mutating: +L = [1, 4, 3, 2, 5] +assert sortedEvens([1, 4, 3, 2, 5]) == [2, 4] +assert L == [1, 4, 3, 2, 5] +print("Passed!") -- 2.51.2