From d84fbcad3afe467ffc5c2a711c6a573a70b137f2 Mon Sep 17 00:00:00 2001 From: Rohan R Bharadwaj Date: Wed, 10 Nov 2021 19:58:57 +0530 Subject: [PATCH 1/7] Update matrix_operation.py --- matrix/matrix_operation.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/matrix/matrix_operation.py b/matrix/matrix_operation.py index dca01f9c3183..50c3bfdcd5a3 100644 --- a/matrix/matrix_operation.py +++ b/matrix/matrix_operation.py @@ -3,6 +3,7 @@ """ from __future__ import annotations +from typing import Optional def add(*matrix_s: list[list]) -> list[list]: @@ -18,6 +19,7 @@ def add(*matrix_s: list[list]) -> list[list]: for i in matrix_s[1:]: _verify_matrix_sizes(matrix_s[0], i) return [[sum(t) for t in zip(*m)] for m in zip(*matrix_s)] + raise TypeError("Expected a matrix, got int/list instead") def subtract(matrix_a: list[list], matrix_b: list[list]) -> list[list]: @@ -33,9 +35,10 @@ def subtract(matrix_a: list[list], matrix_b: list[list]) -> list[list]: and _verify_matrix_sizes(matrix_a, matrix_b) ): return [[i - j for i, j in zip(*m)] for m in zip(matrix_a, matrix_b)] + raise TypeError("Expected a matrix, got int/list instead") -def scalar_multiply(matrix: list[list], n: int) -> list[list]: +def scalar_multiply(matrix: list[list], n: int | float) -> list[list]: """ >>> scalar_multiply([[1,2],[3,4]],5) [[5, 10], [15, 20]] @@ -79,7 +82,7 @@ def identity(n: int) -> list[list]: return [[int(row == column) for column in range(n)] for row in range(n)] -def transpose(matrix: list[list], return_map: bool = True) -> list[list]: +def transpose(matrix: list[list], return_map: bool = True) -> list[list] | map[list]: """ >>> transpose([[1,2],[3,4]]) # doctest: +ELLIPSIS list[list]: return map(list, zip(*matrix)) else: return list(map(list, zip(*matrix))) - + raise TypeError("Expected a matrix, got int/list instead") def minor(matrix: list[list], row: int, column: int) -> list[list]: """ @@ -118,7 +121,7 @@ def determinant(matrix: list[list]) -> int: ) -def inverse(matrix: list[list]) -> list[list]: +def inverse(matrix: list[list]) -> Optional[list[list]]: """ >>> inverse([[1, 2], [3, 4]]) [[-2.0, 1.0], [1.5, -0.5]] @@ -138,21 +141,21 @@ def inverse(matrix: list[list]) -> list[list]: [x * (-1) ** (row + col) for col, x in enumerate(matrix_minor[row])] for row in range(len(matrix)) ] - adjugate = transpose(cofactors) + adjugate = list(transpose(cofactors)) return scalar_multiply(adjugate, 1 / det) def _check_not_integer(matrix: list[list]) -> bool: if not isinstance(matrix, int) and not isinstance(matrix[0], int): return True - raise TypeError("Expected a matrix, got int/list instead") + return False -def _shape(matrix: list[list]) -> list: +def _shape(matrix: list[list]) -> tuple[int, int]: return len(matrix), len(matrix[0]) -def _verify_matrix_sizes(matrix_a: list[list], matrix_b: list[list]) -> tuple[list]: +def _verify_matrix_sizes(matrix_a: list[list], matrix_b: list[list]) -> tuple[tuple, tuple]: shape = _shape(matrix_a) + _shape(matrix_b) if shape[0] != shape[3] or shape[1] != shape[2]: raise ValueError( From 5ef11d2046fc5a211835183938226fb9a7e72506 Mon Sep 17 00:00:00 2001 From: Rohan R Bharadwaj Date: Wed, 10 Nov 2021 19:59:25 +0530 Subject: [PATCH 2/7] Update mypy.ini --- mypy.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypy.ini b/mypy.ini index 94fb125fb124..f00b3eeb6bac 100644 --- a/mypy.ini +++ b/mypy.ini @@ -2,4 +2,4 @@ ignore_missing_imports = True install_types = True non_interactive = True -exclude = (matrix_operation.py|other/least_recently_used.py|other/lfu_cache.py|other/lru_cache.py) +exclude = (other/least_recently_used.py|other/lfu_cache.py|other/lru_cache.py) From e98d818045130377b4527ed701f41d355d0a4778 Mon Sep 17 00:00:00 2001 From: Rohan R Bharadwaj Date: Wed, 10 Nov 2021 20:00:40 +0530 Subject: [PATCH 3/7] Update DIRECTORY.md --- DIRECTORY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 883b81b2444d..c46d81ab75bc 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -854,6 +854,8 @@ * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_135/sol1.py) * Problem 144 * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_144/sol1.py) + * Problem 145 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_145/sol1.py) * Problem 173 * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_173/sol1.py) * Problem 174 From f24ca202d4adaabde4007e9a85439e70e9e1f257 Mon Sep 17 00:00:00 2001 From: Rohan R Bharadwaj Date: Wed, 10 Nov 2021 20:06:52 +0530 Subject: [PATCH 4/7] formatting --- matrix/matrix_operation.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/matrix/matrix_operation.py b/matrix/matrix_operation.py index 50c3bfdcd5a3..f6117f1b7566 100644 --- a/matrix/matrix_operation.py +++ b/matrix/matrix_operation.py @@ -96,6 +96,7 @@ def transpose(matrix: list[list], return_map: bool = True) -> list[list] | map[l return list(map(list, zip(*matrix))) raise TypeError("Expected a matrix, got int/list instead") + def minor(matrix: list[list], row: int, column: int) -> list[list]: """ >>> minor([[1, 2], [3, 4]], 1, 1) @@ -155,8 +156,9 @@ def _shape(matrix: list[list]) -> tuple[int, int]: return len(matrix), len(matrix[0]) -def _verify_matrix_sizes(matrix_a: list[list], matrix_b: list[list]) -> tuple[tuple, tuple]: - shape = _shape(matrix_a) + _shape(matrix_b) +def _verify_matrix_sizes( + matrix_a: list[list], matrix_b: list[list] +) -> tuple[tuple, tuple]: if shape[0] != shape[3] or shape[1] != shape[2]: raise ValueError( f"operands could not be broadcast together with shape " From 48fc22dfe7042ba8627708166a0a0dbf174ed90a Mon Sep 17 00:00:00 2001 From: Rohan R Bharadwaj Date: Wed, 10 Nov 2021 20:12:00 +0530 Subject: [PATCH 5/7] Update matrix_operation.py --- matrix/matrix_operation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/matrix/matrix_operation.py b/matrix/matrix_operation.py index f6117f1b7566..cce6b994b5b4 100644 --- a/matrix/matrix_operation.py +++ b/matrix/matrix_operation.py @@ -3,7 +3,6 @@ """ from __future__ import annotations -from typing import Optional def add(*matrix_s: list[list]) -> list[list]: @@ -122,7 +121,7 @@ def determinant(matrix: list[list]) -> int: ) -def inverse(matrix: list[list]) -> Optional[list[list]]: +def inverse(matrix: list[list]) -> list[list] | None: """ >>> inverse([[1, 2], [3, 4]]) [[-2.0, 1.0], [1.5, -0.5]] @@ -159,6 +158,7 @@ def _shape(matrix: list[list]) -> tuple[int, int]: def _verify_matrix_sizes( matrix_a: list[list], matrix_b: list[list] ) -> tuple[tuple, tuple]: + shape = _shape(matrix_a) + _shape(matrix_b) if shape[0] != shape[3] or shape[1] != shape[2]: raise ValueError( f"operands could not be broadcast together with shape " From 67d3237913a02186fd90a549b884ad360f76a939 Mon Sep 17 00:00:00 2001 From: Rohan R Bharadwaj Date: Wed, 10 Nov 2021 20:41:48 +0530 Subject: [PATCH 6/7] doctest for exception --- matrix/matrix_operation.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/matrix/matrix_operation.py b/matrix/matrix_operation.py index cce6b994b5b4..4f1abdac338b 100644 --- a/matrix/matrix_operation.py +++ b/matrix/matrix_operation.py @@ -13,6 +13,10 @@ def add(*matrix_s: list[list]) -> list[list]: [[3.2, 5.4], [7, 9]] >>> add([[1, 2], [4, 5]], [[3, 7], [3, 4]], [[3, 5], [5, 7]]) [[7, 14], [12, 16]] + >>> add([3], [4, 5]) + Traceback (most recent call last): + ... + TypeError: Expected a matrix, got int/list instead """ if all(_check_not_integer(m) for m in matrix_s): for i in matrix_s[1:]: @@ -27,6 +31,10 @@ def subtract(matrix_a: list[list], matrix_b: list[list]) -> list[list]: [[-1, -1], [-1, -1]] >>> subtract([[1,2.5],[3,4]],[[2,3],[4,5.5]]) [[-1, -0.5], [-1, -1.5]] + >>> subtract([3], [4, 5]) + Traceback (most recent call last): + ... + TypeError: Expected a matrix, got int/list instead """ if ( _check_not_integer(matrix_a) From efa64868c7163d3b057ea8824e27c97a57b5c935 Mon Sep 17 00:00:00 2001 From: Rohan R Bharadwaj Date: Wed, 10 Nov 2021 20:49:01 +0530 Subject: [PATCH 7/7] A bit more... --- matrix/matrix_operation.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/matrix/matrix_operation.py b/matrix/matrix_operation.py index 4f1abdac338b..6d0cd4e655eb 100644 --- a/matrix/matrix_operation.py +++ b/matrix/matrix_operation.py @@ -95,6 +95,10 @@ def transpose(matrix: list[list], return_map: bool = True) -> list[list] | map[l >> transpose([[1,2],[3,4]], return_map=False) [[1, 3], [2, 4]] + >>> transpose([1, [2, 3]]) + Traceback (most recent call last): + ... + TypeError: Expected a matrix, got int/list instead """ if _check_not_integer(matrix): if return_map: @@ -154,9 +158,7 @@ def inverse(matrix: list[list]) -> list[list] | None: def _check_not_integer(matrix: list[list]) -> bool: - if not isinstance(matrix, int) and not isinstance(matrix[0], int): - return True - return False + return not isinstance(matrix, int) and not isinstance(matrix[0], int) def _shape(matrix: list[list]) -> tuple[int, int]: