From dcd26cb0db4800b5852b1f12c8a9acfe879037a9 Mon Sep 17 00:00:00 2001 From: TheRealSaiTama Date: Wed, 11 Oct 2023 11:38:44 +0530 Subject: [PATCH 1/2] Fixes: fix the code to return tuple so we can add doctests in it and make cover higher in dynamic_programming/subset_generation.py --- dynamic_programming/subset_generation.py | 34 ++++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/dynamic_programming/subset_generation.py b/dynamic_programming/subset_generation.py index 819fd8106def..f9810e78d9e4 100644 --- a/dynamic_programming/subset_generation.py +++ b/dynamic_programming/subset_generation.py @@ -1,44 +1,44 @@ -# Print all subset combinations of n element in given set of r element. +# Return all subset combinations of n element in given set of r element. def combination_util(arr, n, r, index, data, i): """ - Current combination is ready to be printed, print it + Current combination is ready to be returned, return it arr[] ---> Input Array data[] ---> Temporary array to store current combination start & end ---> Staring and Ending indexes in arr[] index ---> Current index in data[] - r ---> Size of a combination to be printed + r ---> Size of a combination to be returned """ if index == r: - for j in range(r): - print(data[j], end=" ") - print(" ") - return + return tuple(data) # When no more elements are there to put in data[] if i >= n: - return + return None # current is included, put next at next location data[index] = arr[i] - combination_util(arr, n, r, index + 1, data, i + 1) + res1 = combination_util(arr, n, r, index + 1, data, i + 1) # current is excluded, replace it with # next (Note that i+1 is passed, but # index is not changed) - combination_util(arr, n, r, index, data, i + 1) - # The main function that prints all combinations - # of size r in arr[] of size n. This function - # mainly uses combinationUtil() + res2 = combination_util(arr, n, r, index, data, i + 1) + if res1 is None: + return res2 + elif res2 is None: + return res1 + else: + return res1, res2 -def print_combination(arr, n, r): +def get_combinations(arr, n, r): # A temporary array to store all combination one by one data = [0] * r - # Print all combination using temporary array 'data[]' - combination_util(arr, n, r, 0, data, 0) + # Return all combination using temporary array 'data[]' + return combination_util(arr, n, r, 0, data, 0) if __name__ == "__main__": # Driver code to check the function above arr = [10, 20, 30, 40, 50] - print_combination(arr, len(arr), 3) + print(get_combinations(arr, len(arr), 3)) # This code is contributed by Ambuj sahu From 18cf0884eca04c276b0969434170d56ca768c882 Mon Sep 17 00:00:00 2001 From: Keshav Kumar Jha <110764833+TheRealSaiTama@users.noreply.github.com> Date: Sat, 14 Oct 2023 17:15:52 +0000 Subject: [PATCH 2/2] Update subset_generation.py Resolved error, provided type hints to the function signature and proper name and its type and description --- dynamic_programming/subset_generation.py | 40 +++++++++++++----------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/dynamic_programming/subset_generation.py b/dynamic_programming/subset_generation.py index f9810e78d9e4..b3f8604cd368 100644 --- a/dynamic_programming/subset_generation.py +++ b/dynamic_programming/subset_generation.py @@ -1,26 +1,26 @@ -# Return all subset combinations of n element in given set of r element. +from typing import List, Tuple, Union -def combination_util(arr, n, r, index, data, i): +def combination_util( + arr: List[int], n: int, r: int, index: int, data: List[int], i: int +) -> Union[Tuple[int, ...], None]: """ - Current combination is ready to be returned, return it - arr[] ---> Input Array - data[] ---> Temporary array to store current combination - start & end ---> Staring and Ending indexes in arr[] - index ---> Current index in data[] - r ---> Size of a combination to be returned + Generate all combinations of 'r' elements from a given set of 'n' elements. + + :param arr: List of input elements + :param n: Number of elements in the input list + :param r: Size of the combination to be generated + :param index: Current index in the 'data' list + :param data: Temporary list to store the current combination + :param i: Current index in the 'arr' list + :return: A tuple representing a combination of 'r' elements, or None if no more combinations are possible. """ if index == r: return tuple(data) - # When no more elements are there to put in data[] if i >= n: return None - # current is included, put next at next location data[index] = arr[i] res1 = combination_util(arr, n, r, index + 1, data, i + 1) - # current is excluded, replace it with - # next (Note that i+1 is passed, but - # index is not changed) res2 = combination_util(arr, n, r, index, data, i + 1) if res1 is None: return res2 @@ -30,15 +30,19 @@ def combination_util(arr, n, r, index, data, i): return res1, res2 -def get_combinations(arr, n, r): - # A temporary array to store all combination one by one +def get_combinations(arr: List[int], n: int, r: int) -> List[Tuple[int, ...]]: + """ + Generate all combinations of 'r' elements from the given list of elements. + + :param arr: List of input elements + :param n: Number of elements in the input list + :param r: Size of the combination to be generated + :return: A list of tuples representing combinations of 'r' elements. + """ data = [0] * r - # Return all combination using temporary array 'data[]' return combination_util(arr, n, r, 0, data, 0) if __name__ == "__main__": - # Driver code to check the function above arr = [10, 20, 30, 40, 50] print(get_combinations(arr, len(arr), 3)) - # This code is contributed by Ambuj sahu