From 2e5682d6df3e89aaa16be9be631f75d29352c021 Mon Sep 17 00:00:00 2001 From: rudra Date: Mon, 3 Aug 2026 23:57:28 +0530 Subject: [PATCH 1/2] fix(Converting_Roman_to_Integer): handle missing args, case sensitivity, and input validation --- .../Converting_Roman_to_Integer.py | 69 +++++++++++-------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/Converting_Roman_to_Integer/Converting_Roman_to_Integer.py b/Converting_Roman_to_Integer/Converting_Roman_to_Integer.py index 5ad1ef3b..29d73e6f 100644 --- a/Converting_Roman_to_Integer/Converting_Roman_to_Integer.py +++ b/Converting_Roman_to_Integer/Converting_Roman_to_Integer.py @@ -1,28 +1,41 @@ -import sys - - -romanStr = sys.argv[1] -romanStr = str(romanStr) -dict = { - 'I':1, - 'V':5, - 'X':10, - 'L':50, - 'C':100, - 'D':500, - 'M':1000 -} - -num = 0 - -romanStr = romanStr.replace("IV","IIII") -romanStr = romanStr.replace("IX","VIIII") -romanStr = romanStr.replace("XL","XXXX") -romanStr = romanStr.replace("XC","LXXXX") -romanStr = romanStr.replace("CD","CCCC") -romanStr = romanStr.replace("CM","DCCCC") -myStr = list(romanStr) -for char in myStr: - num = num + dict[char] - -print(num) \ No newline at end of file +import sys + +if len(sys.argv) > 1: + romanStr = sys.argv[1] +else: + romanStr = input("Enter a Roman numeral: ") + +romanStr = str(romanStr).strip().upper() + +if not romanStr: + print("Error: No Roman numeral provided.") + sys.exit(1) + +ROMAN_VALUES = { + 'I': 1, + 'V': 5, + 'X': 10, + 'L': 50, + 'C': 100, + 'D': 500, + 'M': 1000 +} + +invalid_chars = [char for char in romanStr if char not in ROMAN_VALUES] +if invalid_chars: + print(f"Error: Invalid Roman numeral character(s) '{''.join(set(invalid_chars))}'.") + sys.exit(1) + +num = 0 + +romanStr = romanStr.replace("IV", "IIII") +romanStr = romanStr.replace("IX", "VIIII") +romanStr = romanStr.replace("XL", "XXXX") +romanStr = romanStr.replace("XC", "LXXXX") +romanStr = romanStr.replace("CD", "CCCC") +romanStr = romanStr.replace("CM", "DCCCC") + +for char in romanStr: + num += ROMAN_VALUES[char] + +print(num) \ No newline at end of file From cc07c472c203a28b6115d635131a9a5dd8d54499 Mon Sep 17 00:00:00 2001 From: rudra Date: Tue, 4 Aug 2026 00:04:27 +0530 Subject: [PATCH 2/2] fix(Binary_Search_Tree): fix BST deletion algorithm, constructor defaults, and add search/inorder methods --- Binary_Search_Tree/bst.py | 156 +++++++++++++++++++------------------- 1 file changed, 80 insertions(+), 76 deletions(-) diff --git a/Binary_Search_Tree/bst.py b/Binary_Search_Tree/bst.py index 78acfbb3..e844a7c7 100644 --- a/Binary_Search_Tree/bst.py +++ b/Binary_Search_Tree/bst.py @@ -1,89 +1,93 @@ class BST: - def __init__(self,val,left,right): + def __init__(self, val, left=None, right=None): self.val = val self.left = left self.right = right - def addHelper(self,root,data): - - # case for reaching current leafs, base cases - if root.val < data and root.right == None: - root.right = BST(data,None,None) - return "insertion completed" - elif root.val > data and root.left == None: - root.left = BST(data,None,None) - return "insertion completed" - - # else we continue tracing downwards - if root.val < data: - return self.add(root.right,data) - elif root.val > data: - return self.add(root.left,data) + def addHelper(self, root, data): + if data < root.val: + if root.left is None: + root.left = BST(data) + return "insertion completed" + else: + return self.addHelper(root.left, data) + elif data > root.val: + if root.right is None: + root.right = BST(data) + return "insertion completed" + else: + return self.addHelper(root.right, data) else: return "insertion failed: duplicate value" - - def add(self,root,data): - if root == None: - return "insertion failed: empty root" - return self.addHelper(root,data) - - def restructdata(self,root): - # base case: we reach a leaf - if root == None or (root.left == None and root.right == None): - root = None - return "restructure finished" - - # need dummy nodes to compare target value to children value - v1 = float('-inf') - v2 = float('inf') - if root.left != None: - v1 = root.left.val - if root.right != None: - v2 = root.right.val - - temp = root.val - if v1 > v2 or v2 == float('inf'): - root.val = root.left.val - root.left.val = temp - return self.restructdata(root.left) - else: - root.val = root.right.val - root.right.val = temp - return self.restructdata(root.right) - - - def removeHelper(self,root,data): - if root == None: - return "deletion failed: could not find value" - - # adhering to typical bst properties - if root.val < data: - return self.removeHelper(root.right,data) - elif root.val > data: - return self.removeHelper(root.left,data) + + def add(self, data, root=None): + if root is None: + root = self + return self.addHelper(root, data) + + def _get_min(self, root): + current = root + while current.left is not None: + current = current.left + return current.val + + def removeHelper(self, root, data): + if root is None: + return root, False + + deleted = False + if data < root.val: + root.left, deleted = self.removeHelper(root.left, data) + elif data > root.val: + root.right, deleted = self.removeHelper(root.right, data) else: - temp = root.val - v1 = float('-inf') - v2 = float('inf') - if root.left != None: - v1 = root.left.val - elif root.right != None: - v2 = root.right.val - - if v1 > v2 or v2 == float('inf'): - root.val = root.left.val - root.left.val = temp - return self.restructdata(root.left) - else: - root.val = root.right.val - root.right.val = temp - return self.restructdata(root.right) - - def remove(self,root,data): - if root == None: + deleted = True + # Case 1: Leaf node + if root.left is None and root.right is None: + return None, True + # Case 2: One child + if root.left is None: + return root.right, True + if root.right is None: + return root.left, True + # Case 3: Two children - replace with in-order successor + min_val = self._get_min(root.right) + root.val = min_val + root.right, _ = self.removeHelper(root.right, min_val) + + return root, deleted + + def remove(self, data, root=None): + if root is None: + root = self + + if root == self and self.val == data and self.left is None and self.right is None: return "deletion failed: deleting from an empty tree" - return self.removeHelper(root,data) + + _, deleted = self.removeHelper(root, data) + if deleted: + return "deletion completed" + return "deletion failed: could not find value" + + def search(self, data): + if data == self.val: + return True + elif data < self.val and self.left: + return self.left.search(data) + elif data > self.val and self.right: + return self.right.search(data) + return False + + def inorder(self): + result = [] + if self.left: + result.extend(self.left.inorder()) + result.append(self.val) + if self.right: + result.extend(self.right.inorder()) + return result +