From cde8776a564bb5ce8081c307633cd9aaf43ac801 Mon Sep 17 00:00:00 2001 From: Siddhant Jain Date: Sun, 5 Jan 2025 19:20:26 -0500 Subject: [PATCH 1/5] doctest in all_combinations.py --- backtracking/all_combinations.py | 48 ++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/backtracking/all_combinations.py b/backtracking/all_combinations.py index 390decf3a05b..8bfba7c48fa7 100644 --- a/backtracking/all_combinations.py +++ b/backtracking/all_combinations.py @@ -12,14 +12,32 @@ def combination_lists(n: int, k: int) -> list[list[int]]: """ + Generates all possible combinations of k numbers out of 1 ... n using itertools. + >>> combination_lists(n=4, k=2) [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] + >>> combination_lists(n=5, k=3) + [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 3, 4], [1, 3, 5], [1, 4, 5], [2, 3, 4], [2, 3, 5], [2, 4, 5], [3, 4, 5]] + >>> combination_lists(n=0, k=0) + [] + >>> combination_lists(n=1, k=1) + [[1]] + >>> combination_lists(n=3, k=0) + [] + >>> combination_lists(n=3, k=4) + [] + >>> combination_lists(n=-1, k=2) + [] + >>> combination_lists(n=4, k=-1) + [] """ return [list(x) for x in combinations(range(1, n + 1), k)] def generate_all_combinations(n: int, k: int) -> list[list[int]]: """ + Generates all possible combinations of k numbers out of 1 ... n using backtracking. + >>> generate_all_combinations(n=4, k=2) [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] >>> generate_all_combinations(n=0, k=0) @@ -34,6 +52,14 @@ def generate_all_combinations(n: int, k: int) -> list[list[int]]: ValueError: n must not be negative >>> generate_all_combinations(n=5, k=4) [[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [2, 3, 4, 5]] + >>> generate_all_combinations(n=3, k=3) + [[1, 2, 3]] + >>> generate_all_combinations(n=3, k=1) + [[1], [2], [3]] + >>> generate_all_combinations(n=1, k=0) + [[]] + >>> generate_all_combinations(n=1, k=1) + [[1]] >>> from itertools import combinations >>> all(generate_all_combinations(n, k) == combination_lists(n, k) ... for n in range(1, 6) for k in range(1, 6)) @@ -56,6 +82,28 @@ def create_all_state( current_list: list[int], total_list: list[list[int]], ) -> None: + """ + Helper function to recursively build all combinations. + + >>> create_all_state(1, 4, 2, [], result := []) + >>> result + [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] + >>> create_all_state(1, 3, 3, [], result := []) + >>> result + [[1, 2, 3]] + >>> create_all_state(2, 2, 1, [1], result := []) + >>> result + [[1, 2]] + >>> create_all_state(1, 0, 0, [], result := []) + >>> result + [[]] + >>> create_all_state(1, 4, 0, [1, 2], result := []) + >>> result + [[1, 2]] + >>> create_all_state(5, 4, 2, [1, 2], result := []) + >>> result + [] + """ if level == 0: total_list.append(current_list[:]) return From 3b593f1e8924bd3f29842d363758d9d9fd25689f Mon Sep 17 00:00:00 2001 From: Siddhant Jain Date: Sun, 5 Jan 2025 19:41:10 -0500 Subject: [PATCH 2/5] added doctest in all_combinations.py --- backtracking/all_combinations.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/backtracking/all_combinations.py b/backtracking/all_combinations.py index 8bfba7c48fa7..0e7a36109191 100644 --- a/backtracking/all_combinations.py +++ b/backtracking/all_combinations.py @@ -17,8 +17,10 @@ def combination_lists(n: int, k: int) -> list[list[int]]: >>> combination_lists(n=4, k=2) [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] >>> combination_lists(n=5, k=3) - [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 3, 4], [1, 3, 5], [1, 4, 5], [2, 3, 4], [2, 3, 5], [2, 4, 5], [3, 4, 5]] - >>> combination_lists(n=0, k=0) + [[1, 2, 3], [1, 2, 4], [1, 2, 5], + [1, 3, 4], [1, 3, 5], [1, 4, 5], + [2, 3, 4], [2, 3, 5], [2, 4, 5], + [3, 4, 5]] [] >>> combination_lists(n=1, k=1) [[1]] From 9a3687c1da14d79449c9ad812b72c3e2dedfcddf Mon Sep 17 00:00:00 2001 From: Siddhant Jain Date: Sun, 5 Jan 2025 19:56:03 -0500 Subject: [PATCH 3/5] doctests in all_combinations.py --- backtracking/all_combinations.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/backtracking/all_combinations.py b/backtracking/all_combinations.py index 0e7a36109191..259ff22b7f4c 100644 --- a/backtracking/all_combinations.py +++ b/backtracking/all_combinations.py @@ -16,12 +16,6 @@ def combination_lists(n: int, k: int) -> list[list[int]]: >>> combination_lists(n=4, k=2) [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] - >>> combination_lists(n=5, k=3) - [[1, 2, 3], [1, 2, 4], [1, 2, 5], - [1, 3, 4], [1, 3, 5], [1, 4, 5], - [2, 3, 4], [2, 3, 5], [2, 4, 5], - [3, 4, 5]] - [] >>> combination_lists(n=1, k=1) [[1]] >>> combination_lists(n=3, k=0) From ec1951dfdc3dd93b01323607be1c426c48ca78fe Mon Sep 17 00:00:00 2001 From: Siddhant Jain Date: Sun, 5 Jan 2025 20:10:34 -0500 Subject: [PATCH 4/5] add doctest all_combinations.py --- backtracking/all_combinations.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/backtracking/all_combinations.py b/backtracking/all_combinations.py index 259ff22b7f4c..0d0fd259bb5f 100644 --- a/backtracking/all_combinations.py +++ b/backtracking/all_combinations.py @@ -16,16 +16,11 @@ def combination_lists(n: int, k: int) -> list[list[int]]: >>> combination_lists(n=4, k=2) [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] - >>> combination_lists(n=1, k=1) - [[1]] - >>> combination_lists(n=3, k=0) - [] - >>> combination_lists(n=3, k=4) - [] - >>> combination_lists(n=-1, k=2) - [] - >>> combination_lists(n=4, k=-1) - [] + >>> combination_lists(n=5, k=3) + [[1, 2, 3], [1, 2, 4], [1, 2, 5], + [1, 3, 4], [1, 3, 5], [1, 4, 5], + [2, 3, 4], [2, 3, 5], [2, 4, 5], + [3, 4, 5]] """ return [list(x) for x in combinations(range(1, n + 1), k)] From b901cc072acc38a8f36db1dd19daa82dce08a75f Mon Sep 17 00:00:00 2001 From: Siddhant Jain Date: Sun, 5 Jan 2025 20:17:14 -0500 Subject: [PATCH 5/5] add --- backtracking/all_combinations.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/backtracking/all_combinations.py b/backtracking/all_combinations.py index 0d0fd259bb5f..1d15c6263e14 100644 --- a/backtracking/all_combinations.py +++ b/backtracking/all_combinations.py @@ -16,11 +16,6 @@ def combination_lists(n: int, k: int) -> list[list[int]]: >>> combination_lists(n=4, k=2) [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] - >>> combination_lists(n=5, k=3) - [[1, 2, 3], [1, 2, 4], [1, 2, 5], - [1, 3, 4], [1, 3, 5], [1, 4, 5], - [2, 3, 4], [2, 3, 5], [2, 4, 5], - [3, 4, 5]] """ return [list(x) for x in combinations(range(1, n + 1), k)]