From d2b05275094346caceff8afefea11b4409cad100 Mon Sep 17 00:00:00 2001 From: aydinomer00 <109145643+aydinomer00@users.noreply.github.com> Date: Thu, 2 Jan 2025 22:09:33 +0300 Subject: [PATCH 01/12] Add butterfly pattern implementation --- graphics/butterfly_pattern.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 graphics/butterfly_pattern.py diff --git a/graphics/butterfly_pattern.py b/graphics/butterfly_pattern.py new file mode 100644 index 000000000000..03b3a72bb53b --- /dev/null +++ b/graphics/butterfly_pattern.py @@ -0,0 +1,15 @@ +def butterfly_pattern(n): + # Üst kısım + for i in range(1, n + 1): + print("*" * i, end="") + print(" " * (2 * (n - i)), end="") + print("*" * i) + + # Alt kısım + for i in range(n-1, 0, -1): + print("*" * i, end="") + print(" " * (2 * (n - i)), end="") + print("*" * i) + +n = int(input("Enter the size: ")) +butterfly_pattern(n) \ No newline at end of file From d8a717920953520bd5fa3a5d304b0f34bd31a24b Mon Sep 17 00:00:00 2001 From: aydinomer00 <109145643+aydinomer00@users.noreply.github.com> Date: Thu, 2 Jan 2025 22:11:09 +0300 Subject: [PATCH 02/12] Add butterfly pattern implementation --- graphics/butterfly_pattern.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/graphics/butterfly_pattern.py b/graphics/butterfly_pattern.py index 03b3a72bb53b..12e57c056648 100644 --- a/graphics/butterfly_pattern.py +++ b/graphics/butterfly_pattern.py @@ -1,11 +1,11 @@ def butterfly_pattern(n): - # Üst kısım + # Upper part for i in range(1, n + 1): print("*" * i, end="") print(" " * (2 * (n - i)), end="") print("*" * i) - # Alt kısım + # Lower part for i in range(n-1, 0, -1): print("*" * i, end="") print(" " * (2 * (n - i)), end="") From 459613ebd503a41a23c36d559320cb4ff4269144 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 2 Jan 2025 19:13:34 +0000 Subject: [PATCH 03/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- graphics/butterfly_pattern.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/graphics/butterfly_pattern.py b/graphics/butterfly_pattern.py index 12e57c056648..6fd15b38b148 100644 --- a/graphics/butterfly_pattern.py +++ b/graphics/butterfly_pattern.py @@ -6,10 +6,11 @@ def butterfly_pattern(n): print("*" * i) # Lower part - for i in range(n-1, 0, -1): + for i in range(n - 1, 0, -1): print("*" * i, end="") print(" " * (2 * (n - i)), end="") print("*" * i) + n = int(input("Enter the size: ")) -butterfly_pattern(n) \ No newline at end of file +butterfly_pattern(n) From a9703e110d521924f58f561cae0d28f7bab87007 Mon Sep 17 00:00:00 2001 From: aydinomer00 <109145643+aydinomer00@users.noreply.github.com> Date: Thu, 2 Jan 2025 22:35:55 +0300 Subject: [PATCH 04/12] Add Traveling Salesman Problem implementation --- dynamic_programming/travelling_salesman.py | 72 ++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 dynamic_programming/travelling_salesman.py diff --git a/dynamic_programming/travelling_salesman.py b/dynamic_programming/travelling_salesman.py new file mode 100644 index 000000000000..4f7d93723b3e --- /dev/null +++ b/dynamic_programming/travelling_salesman.py @@ -0,0 +1,72 @@ +from typing import List, Tuple + + +def tsp_dp(distances: List[List[float]]) -> Tuple[float, List[int]]: + """ + Solves Traveling Salesman Problem using dynamic programming. + + >>> distances = [[0, 10, 15, 20], [10, 0, 35, 25], [15, 35, 0, 30], [20, 25, 30, 0]] + >>> cost, path = tsp_dp(distances) + >>> float(cost) + 80.0 + >>> path[0] + 0 + + >>> distances = [[0, 5], [5, 0]] + >>> cost, path = tsp_dp(distances) + >>> float(cost) + 10.0 + >>> path + [0, 1] + """ + if not distances: + raise ValueError("Empty distance matrix") + + n = len(distances) + all_points = (1 << n) - 1 + dp = {} + parent = {} + + def solve(mask: int, pos: int) -> float: + if mask == all_points: + return distances[pos][0] + + state = (mask, pos) + if state in dp: + return dp[state] + + minimum = float('inf') + min_next = -1 + + for next_city in range(n): + if mask & (1 << next_city) == 0: + new_mask = mask | (1 << next_city) + new_dist = distances[pos][next_city] + solve(new_mask, next_city) + + if new_dist < minimum: + minimum = new_dist + min_next = next_city + + dp[state] = minimum + parent[state] = min_next + return minimum + + optimal_cost = solve(1, 0) + + path = [0] + mask = 1 + pos = 0 + + for _ in range(n - 1): + next_pos = parent[(mask, pos)] + path.append(next_pos) + mask |= (1 << next_pos) + pos = next_pos + + return optimal_cost, path + + +if __name__ == "__main__": + import doctest + + doctest.testmod() \ No newline at end of file From e95c476dea36f887e1fcbce915e5d7f78d9015ec Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 2 Jan 2025 19:39:34 +0000 Subject: [PATCH 05/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- dynamic_programming/travelling_salesman.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dynamic_programming/travelling_salesman.py b/dynamic_programming/travelling_salesman.py index 4f7d93723b3e..a9cbbd2d527d 100644 --- a/dynamic_programming/travelling_salesman.py +++ b/dynamic_programming/travelling_salesman.py @@ -35,7 +35,7 @@ def solve(mask: int, pos: int) -> float: if state in dp: return dp[state] - minimum = float('inf') + minimum = float("inf") min_next = -1 for next_city in range(n): @@ -60,7 +60,7 @@ def solve(mask: int, pos: int) -> float: for _ in range(n - 1): next_pos = parent[(mask, pos)] path.append(next_pos) - mask |= (1 << next_pos) + mask |= 1 << next_pos pos = next_pos return optimal_cost, path @@ -69,4 +69,4 @@ def solve(mask: int, pos: int) -> float: if __name__ == "__main__": import doctest - doctest.testmod() \ No newline at end of file + doctest.testmod() From f3379c31ece9ff93af8e7d5e4d41c484bfe959e3 Mon Sep 17 00:00:00 2001 From: aydinomer00 <109145643+aydinomer00@users.noreply.github.com> Date: Thu, 2 Jan 2025 23:11:12 +0300 Subject: [PATCH 06/12] Update type hints for Python 3.9+ compatibility --- dynamic_programming/travelling_salesman.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynamic_programming/travelling_salesman.py b/dynamic_programming/travelling_salesman.py index a9cbbd2d527d..60253c3094fe 100644 --- a/dynamic_programming/travelling_salesman.py +++ b/dynamic_programming/travelling_salesman.py @@ -1,7 +1,7 @@ from typing import List, Tuple -def tsp_dp(distances: List[List[float]]) -> Tuple[float, List[int]]: +def tsp_dp(distances: list[list[float]]) -> tuple[float, list[int]]: """ Solves Traveling Salesman Problem using dynamic programming. From 39fbc0376ade199320c82694ea16e3b191cdcaf3 Mon Sep 17 00:00:00 2001 From: aydinomer00 <109145643+aydinomer00@users.noreply.github.com> Date: Thu, 2 Jan 2025 23:15:50 +0300 Subject: [PATCH 07/12] Remove unused imports and update type hints for Ruff compatibility --- dynamic_programming/travelling_salesman.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dynamic_programming/travelling_salesman.py b/dynamic_programming/travelling_salesman.py index 60253c3094fe..1dfd6100633b 100644 --- a/dynamic_programming/travelling_salesman.py +++ b/dynamic_programming/travelling_salesman.py @@ -1,4 +1,4 @@ -from typing import List, Tuple +import sys def tsp_dp(distances: list[list[float]]) -> tuple[float, list[int]]: @@ -35,7 +35,7 @@ def solve(mask: int, pos: int) -> float: if state in dp: return dp[state] - minimum = float("inf") + minimum = float('inf') min_next = -1 for next_city in range(n): @@ -60,7 +60,7 @@ def solve(mask: int, pos: int) -> float: for _ in range(n - 1): next_pos = parent[(mask, pos)] path.append(next_pos) - mask |= 1 << next_pos + mask |= (1 << next_pos) pos = next_pos return optimal_cost, path From aa46f1ad83a67dd1717295e224d17f15cbb9c00f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 2 Jan 2025 20:16:45 +0000 Subject: [PATCH 08/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- dynamic_programming/travelling_salesman.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dynamic_programming/travelling_salesman.py b/dynamic_programming/travelling_salesman.py index 1dfd6100633b..b9b3e5843141 100644 --- a/dynamic_programming/travelling_salesman.py +++ b/dynamic_programming/travelling_salesman.py @@ -35,7 +35,7 @@ def solve(mask: int, pos: int) -> float: if state in dp: return dp[state] - minimum = float('inf') + minimum = float("inf") min_next = -1 for next_city in range(n): @@ -60,7 +60,7 @@ def solve(mask: int, pos: int) -> float: for _ in range(n - 1): next_pos = parent[(mask, pos)] path.append(next_pos) - mask |= (1 << next_pos) + mask |= 1 << next_pos pos = next_pos return optimal_cost, path From df3b00e3b32183f76c03cb2236aee4375d90cf0d Mon Sep 17 00:00:00 2001 From: aydinomer00 <109145643+aydinomer00@users.noreply.github.com> Date: Thu, 2 Jan 2025 23:20:27 +0300 Subject: [PATCH 09/12] Update Traveling Salesman Problem implementation with detailed doctest and solve function comments --- dynamic_programming/travelling_salesman.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dynamic_programming/travelling_salesman.py b/dynamic_programming/travelling_salesman.py index b9b3e5843141..d60fab67cb8d 100644 --- a/dynamic_programming/travelling_salesman.py +++ b/dynamic_programming/travelling_salesman.py @@ -1,6 +1,5 @@ import sys - def tsp_dp(distances: list[list[float]]) -> tuple[float, list[int]]: """ Solves Traveling Salesman Problem using dynamic programming. @@ -28,6 +27,13 @@ def tsp_dp(distances: list[list[float]]) -> tuple[float, list[int]]: parent = {} def solve(mask: int, pos: int) -> float: + """ + Recursive helper function for solving the TSP using dynamic programming. + + :param mask: Bitmask representing visited nodes. + :param pos: Current position in the tour. + :return: Minimum cost to complete the tour. + """ if mask == all_points: return distances[pos][0] From 5fb415f965ee21815679143f6c61438245e11b4e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 2 Jan 2025 20:22:01 +0000 Subject: [PATCH 10/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- dynamic_programming/travelling_salesman.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dynamic_programming/travelling_salesman.py b/dynamic_programming/travelling_salesman.py index d60fab67cb8d..f707a0a7d614 100644 --- a/dynamic_programming/travelling_salesman.py +++ b/dynamic_programming/travelling_salesman.py @@ -1,5 +1,6 @@ import sys + def tsp_dp(distances: list[list[float]]) -> tuple[float, list[int]]: """ Solves Traveling Salesman Problem using dynamic programming. From 9799ea5fcc6baaff7d75b8a05e9137074f6ba03a Mon Sep 17 00:00:00 2001 From: aydinomer00 <109145643+aydinomer00@users.noreply.github.com> Date: Thu, 2 Jan 2025 23:29:11 +0300 Subject: [PATCH 11/12] Finalize changes after resolving conflicts --- dynamic_programming/travelling_salesman.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/dynamic_programming/travelling_salesman.py b/dynamic_programming/travelling_salesman.py index f707a0a7d614..a2ae3cd23340 100644 --- a/dynamic_programming/travelling_salesman.py +++ b/dynamic_programming/travelling_salesman.py @@ -1,6 +1,3 @@ -import sys - - def tsp_dp(distances: list[list[float]]) -> tuple[float, list[int]]: """ Solves Traveling Salesman Problem using dynamic programming. @@ -42,7 +39,7 @@ def solve(mask: int, pos: int) -> float: if state in dp: return dp[state] - minimum = float("inf") + minimum = float('inf') min_next = -1 for next_city in range(n): @@ -67,7 +64,7 @@ def solve(mask: int, pos: int) -> float: for _ in range(n - 1): next_pos = parent[(mask, pos)] path.append(next_pos) - mask |= 1 << next_pos + mask |= (1 << next_pos) pos = next_pos return optimal_cost, path From 1605f554c4ab43534fb0ada181a2a6cbf2c8ef4a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 2 Jan 2025 20:29:45 +0000 Subject: [PATCH 12/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- dynamic_programming/travelling_salesman.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dynamic_programming/travelling_salesman.py b/dynamic_programming/travelling_salesman.py index a2ae3cd23340..33c09433de9e 100644 --- a/dynamic_programming/travelling_salesman.py +++ b/dynamic_programming/travelling_salesman.py @@ -39,7 +39,7 @@ def solve(mask: int, pos: int) -> float: if state in dp: return dp[state] - minimum = float('inf') + minimum = float("inf") min_next = -1 for next_city in range(n): @@ -64,7 +64,7 @@ def solve(mask: int, pos: int) -> float: for _ in range(n - 1): next_pos = parent[(mask, pos)] path.append(next_pos) - mask |= (1 << next_pos) + mask |= 1 << next_pos pos = next_pos return optimal_cost, path