From ff09802015c98fe036684eb62ea84972486ac392 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Wed, 18 Oct 2023 12:02:33 +0530 Subject: [PATCH 01/33] Added new tests! --- maths/power_using_recursion.py | 74 +++++++++++++++++++++------------- 1 file changed, 46 insertions(+), 28 deletions(-) diff --git a/maths/power_using_recursion.py b/maths/power_using_recursion.py index e82635ba0005..f5e2a8987243 100644 --- a/maths/power_using_recursion.py +++ b/maths/power_using_recursion.py @@ -11,43 +11,61 @@ Output --> 2 to the power of 0 is 1 """ +import pytest def power(base: int, exponent: int) -> float: """ - >>> power(3, 4) + Calculate the power of a base raised to an exponent. + + Examples: + >>> power(3, 4) # Positive exponent 81 - >>> power(2, 0) + >>> power(2, 0) # Zero exponent 1 + >>> power(5, -3) # Negative exponent + 0.008 >>> all(power(base, exponent) == pow(base, exponent) - ... for base in range(-10, 10) for exponent in range(10)) + ...     for base in range(-10, 10) for exponent in range(10)) # Check against built-in pow() function True - >>> power('a', 1) - 'a' - >>> power('a', 2) - Traceback (most recent call last): - ... - TypeError: can't multiply sequence by non-int of type 'str' - >>> power('a', 'b') - Traceback (most recent call last): - ... - TypeError: unsupported operand type(s) for -: 'str' and 'int' - >>> power(2, -1) - Traceback (most recent call last): - ... - RecursionError: maximum recursion depth exceeded """ - return base * power(base, (exponent - 1)) if exponent else 1 + if exponent == 0: + return 1 + elif exponent < 0: + return 1 / power(base, -exponent) + else: + return base * power(base, exponent - 1) + + +@pytest.mark.parametrize("base, exponent", [(1, 2), (2, 3), (3, 4)]) +def test_power_positive_exponent(base, exponent): + assert power(base, exponent) == pow(base, exponent) + + +@pytest.mark.parametrize("base, exponent", [(1, -2), (2, -3), (3, -4)]) +def test_power_negative_exponent(base, exponent): + assert power(base, exponent) == 1 / pow(base, -exponent) + + +def test_power_zero_exponent(): + assert power(1, 0) == 1 + assert power(2, 0) == 1 + assert power(3, 0) == 1 + + +def test_power_with_non_integer_exponent(): + assert power(2, 0.5) == pytest.approx(1.4142135623730951) + assert power(5, -1.5) == pytest.approx(0.4) + assert power(3, 1.3) == pytest.approx(5.916079783099617) + +def test_power_raises_type_error(): + with pytest.raises(TypeError): + power("abc", 2) + with pytest.raises(TypeError): + power(2, "def") -if __name__ == "__main__": - from doctests import testmod - testmod() - print("Raise base to the power of exponent using recursion...") - base = int(input("Enter the base: ").strip()) - exponent = int(input("Enter the exponent: ").strip()) - result = power(base, abs(exponent)) - if exponent < 0: # power() does not properly deal w/ negative exponents - result = 1 / result - print(f"{base} to the power of {exponent} is {result}") +def test_power_raises_value_error(): + with pytest.raises(ValueError): + power(2, -10) From c605c660fd7c971aa7a58218df2f258980a7e5c5 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Wed, 18 Oct 2023 12:03:25 +0530 Subject: [PATCH 02/33] [ADD]: Inproved Tests --- maths/power_using_recursion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/power_using_recursion.py b/maths/power_using_recursion.py index f5e2a8987243..844a8430cdeb 100644 --- a/maths/power_using_recursion.py +++ b/maths/power_using_recursion.py @@ -67,5 +67,5 @@ def test_power_raises_type_error(): def test_power_raises_value_error(): - with pytest.raises(ValueError): + witSh pytest.raises(ValueError): power(2, -10) From 9780df114139ad1f38718b7e5ba2e06f2f0a3ae7 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Wed, 18 Oct 2023 12:28:41 +0530 Subject: [PATCH 03/33] fixed --- maths/power_using_recursion.py | 46 ++++++---------------------------- 1 file changed, 8 insertions(+), 38 deletions(-) diff --git a/maths/power_using_recursion.py b/maths/power_using_recursion.py index 844a8430cdeb..680e07ea7b49 100644 --- a/maths/power_using_recursion.py +++ b/maths/power_using_recursion.py @@ -11,7 +11,6 @@ Output --> 2 to the power of 0 is 1 """ -import pytest def power(base: int, exponent: int) -> float: @@ -19,14 +18,12 @@ def power(base: int, exponent: int) -> float: Calculate the power of a base raised to an exponent. Examples: - >>> power(3, 4) # Positive exponent + >>> power(3, 4) 81 - >>> power(2, 0) # Zero exponent + >>> power(2, 0) 1 - >>> power(5, -3) # Negative exponent - 0.008 >>> all(power(base, exponent) == pow(base, exponent) - ...     for base in range(-10, 10) for exponent in range(10)) # Check against built-in pow() function + ...     for base in range(-10, 10) for exponent in range(10)) True """ if exponent == 0: @@ -37,35 +34,8 @@ def power(base: int, exponent: int) -> float: return base * power(base, exponent - 1) -@pytest.mark.parametrize("base, exponent", [(1, 2), (2, 3), (3, 4)]) -def test_power_positive_exponent(base, exponent): - assert power(base, exponent) == pow(base, exponent) - - -@pytest.mark.parametrize("base, exponent", [(1, -2), (2, -3), (3, -4)]) -def test_power_negative_exponent(base, exponent): - assert power(base, exponent) == 1 / pow(base, -exponent) - - -def test_power_zero_exponent(): - assert power(1, 0) == 1 - assert power(2, 0) == 1 - assert power(3, 0) == 1 - - -def test_power_with_non_integer_exponent(): - assert power(2, 0.5) == pytest.approx(1.4142135623730951) - assert power(5, -1.5) == pytest.approx(0.4) - assert power(3, 1.3) == pytest.approx(5.916079783099617) - - -def test_power_raises_type_error(): - with pytest.raises(TypeError): - power("abc", 2) - with pytest.raises(TypeError): - power(2, "def") - - -def test_power_raises_value_error(): - witSh pytest.raises(ValueError): - power(2, -10) +if __name__ == "__main__": + base = int(input("Enter the base: ").strip()) + exponent = int(input("Enter the exponent: ").strip()) + result = power(base, exponent) + print(f"{base} to the power of {exponent} is {result}") From 35aca479d0b85c7a92b3f9958eb3f4525dbfe727 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Thu, 19 Oct 2023 02:34:09 +0530 Subject: [PATCH 04/33] Removed spaces --- maths/power_using_recursion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/power_using_recursion.py b/maths/power_using_recursion.py index 680e07ea7b49..5b91ac69976f 100644 --- a/maths/power_using_recursion.py +++ b/maths/power_using_recursion.py @@ -23,7 +23,7 @@ def power(base: int, exponent: int) -> float: >>> power(2, 0) 1 >>> all(power(base, exponent) == pow(base, exponent) - ...     for base in range(-10, 10) for exponent in range(10)) + ...for base in range(-10, 10) for exponent in range(10)) True """ if exponent == 0: From 0c5eb560b714a01a7b216944513012aa887fa5dd Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Thu, 19 Oct 2023 03:30:38 +0530 Subject: [PATCH 05/33] Changed the file name --- maths/{power_using_recursion.py => power_recursion.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename maths/{power_using_recursion.py => power_recursion.py} (100%) diff --git a/maths/power_using_recursion.py b/maths/power_recursion.py similarity index 100% rename from maths/power_using_recursion.py rename to maths/power_recursion.py From 3c7ee47436b35152847000da47e9616e493bb23f Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Thu, 19 Oct 2023 03:50:25 +0530 Subject: [PATCH 06/33] Added Changes --- maths/power_recursion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/power_recursion.py b/maths/power_recursion.py index 5b91ac69976f..8baa746cb439 100644 --- a/maths/power_recursion.py +++ b/maths/power_recursion.py @@ -23,7 +23,7 @@ def power(base: int, exponent: int) -> float: >>> power(2, 0) 1 >>> all(power(base, exponent) == pow(base, exponent) - ...for base in range(-10, 10) for exponent in range(10)) + ... for base in range(-10, 10) for exponent in range(10)) True """ if exponent == 0: From 07fb30013d6c16fbae232f9ad4ac573f4d6b3d3b Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Thu, 19 Oct 2023 09:24:40 +0530 Subject: [PATCH 07/33] changed the code and kept the test cases --- ...wer_recursion.py => power_using_recursion.py} | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) rename maths/{power_recursion.py => power_using_recursion.py} (71%) diff --git a/maths/power_recursion.py b/maths/power_using_recursion.py similarity index 71% rename from maths/power_recursion.py rename to maths/power_using_recursion.py index 8baa746cb439..e9c3c4445e8a 100644 --- a/maths/power_recursion.py +++ b/maths/power_using_recursion.py @@ -26,16 +26,18 @@ def power(base: int, exponent: int) -> float: ... for base in range(-10, 10) for exponent in range(10)) True """ - if exponent == 0: - return 1 - elif exponent < 0: - return 1 / power(base, -exponent) - else: - return base * power(base, exponent - 1) + return base * power(base, (exponent - 1)) if exponent else 1 if __name__ == "__main__": + from doctests import testmod + + testmod() + print("Raise base to the power of exponent using recursion...") base = int(input("Enter the base: ").strip()) exponent = int(input("Enter the exponent: ").strip()) - result = power(base, exponent) + result = power(base, abs(exponent)) + if exponent < 0: # power() does not properly deal w/ negative exponents + result = 1 / result print(f"{base} to the power of {exponent} is {result}") + From 290efe86c754476b0aabf8ef98c30053563a1f1d Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Thu, 19 Oct 2023 09:24:53 +0530 Subject: [PATCH 08/33] changed the code and kept the test cases --- maths/power_using_recursion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/power_using_recursion.py b/maths/power_using_recursion.py index e9c3c4445e8a..93e66d5fba53 100644 --- a/maths/power_using_recursion.py +++ b/maths/power_using_recursion.py @@ -31,7 +31,7 @@ def power(base: int, exponent: int) -> float: if __name__ == "__main__": from doctests import testmod - +Sa testmod() print("Raise base to the power of exponent using recursion...") base = int(input("Enter the base: ").strip()) From 0dd5a3cb4e9c1df83dc6371353633f08b55b4ea7 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Thu, 19 Oct 2023 09:25:19 +0530 Subject: [PATCH 09/33] missed the line --- maths/power_using_recursion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/power_using_recursion.py b/maths/power_using_recursion.py index 93e66d5fba53..e9c3c4445e8a 100644 --- a/maths/power_using_recursion.py +++ b/maths/power_using_recursion.py @@ -31,7 +31,7 @@ def power(base: int, exponent: int) -> float: if __name__ == "__main__": from doctests import testmod -Sa + testmod() print("Raise base to the power of exponent using recursion...") base = int(input("Enter the base: ").strip()) From dc817c69db1a8543a7d5f6fd02cc1abc2fbca71e Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Thu, 19 Oct 2023 09:27:21 +0530 Subject: [PATCH 10/33] removed spaces --- maths/power_using_recursion.py | 1 - 1 file changed, 1 deletion(-) diff --git a/maths/power_using_recursion.py b/maths/power_using_recursion.py index e9c3c4445e8a..a3ec6d958650 100644 --- a/maths/power_using_recursion.py +++ b/maths/power_using_recursion.py @@ -40,4 +40,3 @@ def power(base: int, exponent: int) -> float: if exponent < 0: # power() does not properly deal w/ negative exponents result = 1 / result print(f"{base} to the power of {exponent} is {result}") - From 681e02a5329ef409c68b9048f937851493d943a6 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Fri, 20 Oct 2023 06:25:54 +0200 Subject: [PATCH 11/33] Update power_using_recursion.py --- maths/power_using_recursion.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/maths/power_using_recursion.py b/maths/power_using_recursion.py index a3ec6d958650..462fc45bff64 100644 --- a/maths/power_using_recursion.py +++ b/maths/power_using_recursion.py @@ -17,7 +17,6 @@ def power(base: int, exponent: int) -> float: """ Calculate the power of a base raised to an exponent. - Examples: >>> power(3, 4) 81 >>> power(2, 0) @@ -25,6 +24,20 @@ def power(base: int, exponent: int) -> float: >>> all(power(base, exponent) == pow(base, exponent) ... for base in range(-10, 10) for exponent in range(10)) True + >>> power('a', 1) + 'a' + >>> power('a', 2) + Traceback (most recent call last): + ... + TypeError: can't multiply sequence by non-int of type 'str' + >>> power('a', 'b') + Traceback (most recent call last): + ... + TypeError: unsupported operand type(s) for -: 'str' and 'int' + >>> power(2, -1) + Traceback (most recent call last): + ... + RecursionError: maximum recursion depth exceeded """ return base * power(base, (exponent - 1)) if exponent else 1 From c53e78ca67a7a0a89166c6aa07aa777a3c131149 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Fri, 20 Oct 2023 13:03:32 +0530 Subject: [PATCH 12/33] Added new tests in Signum --- maths/signum.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/maths/signum.py b/maths/signum.py index 148f931767c1..509591a07ce2 100644 --- a/maths/signum.py +++ b/maths/signum.py @@ -5,12 +5,13 @@ def signum(num: float) -> int: """ - Applies signum function on the number + Applies signum function on the number - >>> signum(-10) - -1 - >>> signum(10) - 1 + Custom test cases: + >>> signum(-20) + -2 + >>> signum(20) + 2 >>> signum(0) 0 """ From d89a0b9979d5884a2790b60e1660081c3239da7f Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Fri, 20 Oct 2023 13:38:30 +0530 Subject: [PATCH 13/33] Few things added --- maths/signum.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/maths/signum.py b/maths/signum.py index 509591a07ce2..0a2f4bdeacb0 100644 --- a/maths/signum.py +++ b/maths/signum.py @@ -5,13 +5,13 @@ def signum(num: float) -> int: """ - Applies signum function on the number + Applies signum function on the number Custom test cases: >>> signum(-20) - -2 + -1 >>> signum(20) - 2 + 1 >>> signum(0) 0 """ @@ -27,9 +27,15 @@ def test_signum() -> None: assert signum(5) == 1 assert signum(-5) == -1 assert signum(0) == 0 + assert signum(10.5) == 1 + assert signum(-10.5) == -1 + assert signum(1e-6) == 1 + assert signum(-1e-6) == -1 + assert signum(123456789) == 1 + assert signum(-123456789) == -1 -if __name__ == "__main__": +if __name__ == "__main": print(signum(12)) print(signum(-12)) print(signum(0)) From 6d2f1c324f7dd961c34b6d8107826286b42230d1 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Fri, 20 Oct 2023 13:54:11 +0530 Subject: [PATCH 14/33] Removed few stuff and added few changes --- maths/signum.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/maths/signum.py b/maths/signum.py index 0a2f4bdeacb0..9bda38c7f547 100644 --- a/maths/signum.py +++ b/maths/signum.py @@ -14,6 +14,14 @@ def signum(num: float) -> int: 1 >>> signum(0) 0 + >>> signum("a") + 0 + >>> signum([]) + 0 + >>> signum(-10) + -1 + >>> signum(10) + 1 """ if num < 0: return -1 @@ -35,7 +43,7 @@ def test_signum() -> None: assert signum(-123456789) == -1 -if __name__ == "__main": +if __ame__ == "__main": print(signum(12)) print(signum(-12)) print(signum(0)) From 786f1a6d388f70901a166f651386c52a9ba1bfee Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Fri, 20 Oct 2023 14:00:19 +0530 Subject: [PATCH 15/33] Fixed few things --- maths/signum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/signum.py b/maths/signum.py index 9bda38c7f547..85a810787985 100644 --- a/maths/signum.py +++ b/maths/signum.py @@ -43,7 +43,7 @@ def test_signum() -> None: assert signum(-123456789) == -1 -if __ame__ == "__main": +if __name__ == "__main": print(signum(12)) print(signum(-12)) print(signum(0)) From e31687b1f7df50c0fcdea5cdbd13bb4187ac95d4 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Fri, 20 Oct 2023 14:07:37 +0530 Subject: [PATCH 16/33] Reverted the function --- maths/signum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/signum.py b/maths/signum.py index 85a810787985..d9735745f416 100644 --- a/maths/signum.py +++ b/maths/signum.py @@ -43,7 +43,7 @@ def test_signum() -> None: assert signum(-123456789) == -1 -if __name__ == "__main": +if __name__ == "__main__": print(signum(12)) print(signum(-12)) print(signum(0)) From 9daac1a5398dbb56f65705f83c8c724925d69797 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee <69459134+imSanko@users.noreply.github.com> Date: Fri, 20 Oct 2023 14:19:15 +0530 Subject: [PATCH 17/33] Update maths/signum.py Co-authored-by: Christian Clauss --- maths/signum.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/maths/signum.py b/maths/signum.py index d9735745f416..7c8b723c479b 100644 --- a/maths/signum.py +++ b/maths/signum.py @@ -15,7 +15,9 @@ def signum(num: float) -> int: >>> signum(0) 0 >>> signum("a") - 0 + Traceback (most recent call last): + ... + TypeError: '<' not supported between instances of 'str' and 'int' >>> signum([]) 0 >>> signum(-10) From 27b9c8a176515a4e4d0a7722dd985ea1b7a01cff Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Fri, 20 Oct 2023 15:24:46 +0530 Subject: [PATCH 18/33] Added few things --- maths/signum.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/maths/signum.py b/maths/signum.py index 7c8b723c479b..a5b431702ee7 100644 --- a/maths/signum.py +++ b/maths/signum.py @@ -3,7 +3,7 @@ """ -def signum(num: float) -> int: +def signum(num) -> int: """ Applies signum function on the number @@ -15,9 +15,7 @@ def signum(num: float) -> int: >>> signum(0) 0 >>> signum("a") - Traceback (most recent call last): - ... - TypeError: '<' not supported between instances of 'str' and 'int' + 0 >>> signum([]) 0 >>> signum(-10) @@ -25,9 +23,15 @@ def signum(num: float) -> int: >>> signum(10) 1 """ - if num < 0: - return -1 - return 1 if num else 0 + if isinstance(num, (int, float)): + if num < 0: + return -1 + elif num > 0: + return 1 + else: + return 0 + else: + return 0 def test_signum() -> None: @@ -43,6 +47,8 @@ def test_signum() -> None: assert signum(-1e-6) == -1 assert signum(123456789) == 1 assert signum(-123456789) == -1 + assert signum("hello") == 0 + assert signum([]) == 0 if __name__ == "__main__": From 6714d15877f58e3c78b189715c7c4908e003041f Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee <69459134+imSanko@users.noreply.github.com> Date: Fri, 20 Oct 2023 16:07:15 +0530 Subject: [PATCH 19/33] Update maths/signum.py Co-authored-by: Christian Clauss --- maths/signum.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/maths/signum.py b/maths/signum.py index a5b431702ee7..e80e8db96f51 100644 --- a/maths/signum.py +++ b/maths/signum.py @@ -15,7 +15,9 @@ def signum(num) -> int: >>> signum(0) 0 >>> signum("a") - 0 + Traceback (most recent call last): + ... + TypeError: '<' not supported between instances of 'str' and 'int' >>> signum([]) 0 >>> signum(-10) From b4ea39f5a704b25b6621ef9e5a0b77863d2ea75c Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Fri, 20 Oct 2023 16:14:12 +0530 Subject: [PATCH 20/33] Added the type hint back --- maths/signum.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/maths/signum.py b/maths/signum.py index e80e8db96f51..df78ddcf34a0 100644 --- a/maths/signum.py +++ b/maths/signum.py @@ -3,7 +3,7 @@ """ -def signum(num) -> int: +def signum(num: float) -> int: """ Applies signum function on the number @@ -15,9 +15,7 @@ def signum(num) -> int: >>> signum(0) 0 >>> signum("a") - Traceback (most recent call last): - ... - TypeError: '<' not supported between instances of 'str' and 'int' + 0 >>> signum([]) 0 >>> signum(-10) From 0b0a390209828adf1fbd74f21096a2f395b8ca2a Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Fri, 20 Oct 2023 12:59:02 +0200 Subject: [PATCH 21/33] Update signum.py --- maths/signum.py | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/maths/signum.py b/maths/signum.py index df78ddcf34a0..c89753e76637 100644 --- a/maths/signum.py +++ b/maths/signum.py @@ -8,35 +8,38 @@ def signum(num: float) -> int: Applies signum function on the number Custom test cases: - >>> signum(-20) + >>> signum(-10) -1 - >>> signum(20) + >>> signum(10) 1 >>> signum(0) 0 - >>> signum("a") - 0 - >>> signum([]) - 0 - >>> signum(-10) + >>> signum(-20.5) -1 - >>> signum(10) + >>> signum(20.5) 1 + >>> signum(-1e-6) + -1 + >>> signum(1e-6) + 1 + >>> signum("Hello") + Traceback (most recent call last): + ... + TypeError: '<' not supported between instances of 'str' and 'int' + >>> signum([]) + Traceback (most recent call last): + ... + TypeError: '<' not supported between instances of 'list' and 'int' """ - if isinstance(num, (int, float)): - if num < 0: - return -1 - elif num > 0: - return 1 - else: - return 0 - else: - return 0 + if num < 0: + return -1 + return 1 if num else 0 def test_signum() -> None: """ Tests the signum function + >>> test_signum() """ assert signum(5) == 1 assert signum(-5) == -1 @@ -47,8 +50,6 @@ def test_signum() -> None: assert signum(-1e-6) == -1 assert signum(123456789) == 1 assert signum(-123456789) == -1 - assert signum("hello") == 0 - assert signum([]) == 0 if __name__ == "__main__": From 05476d698c2f2d168d7a5ceb8bc5b9023923485e Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Sat, 21 Oct 2023 10:38:12 +0530 Subject: [PATCH 22/33] Added NEW tests for Perfect_Number --- maths/perfect_number.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/maths/perfect_number.py b/maths/perfect_number.py index 148e988fb4c5..86a52681c7a7 100644 --- a/maths/perfect_number.py +++ b/maths/perfect_number.py @@ -14,16 +14,32 @@ def perfect(number: int) -> bool: """ + Check if a number is a perfect number. + + A perfect number is a positive integer that is equal to the sum of its proper + divisors (excluding itself). + + Args: + number (int): The number to be checked. + + Returns: + bool: True if the number is a perfect number, False otherwise. + + Examples: >>> perfect(27) False >>> perfect(28) True >>> perfect(29) False - - Start from 1 because dividing by 0 will raise ZeroDivisionError. - A number at most can be divisible by the half of the number except the number - itself. For example, 6 is at most can be divisible by 3 except by 6 itself. + >>> perfect(6) + True + >>> perfect(12) + False + >>> perfect(496) + True + >>> perfect(8128) + True """ return sum(i for i in range(1, number // 2 + 1) if number % i == 0) == number From 1d42ec904a9516d1b060dce9b15d7be0e5fa6023 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee <69459134+imSanko@users.noreply.github.com> Date: Sat, 21 Oct 2023 11:30:50 +0530 Subject: [PATCH 23/33] Update maths/special_numbers/perfect_number.py Co-authored-by: Christian Clauss --- maths/special_numbers/perfect_number.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maths/special_numbers/perfect_number.py b/maths/special_numbers/perfect_number.py index 86a52681c7a7..9323fa28c215 100644 --- a/maths/special_numbers/perfect_number.py +++ b/maths/special_numbers/perfect_number.py @@ -20,10 +20,10 @@ def perfect(number: int) -> bool: divisors (excluding itself). Args: - number (int): The number to be checked. + number: The number to be checked. Returns: - bool: True if the number is a perfect number, False otherwise. + True if the number is a perfect number, False otherwise. Examples: >>> perfect(27) From 75cb8264f56429f0a63755ff402c59b1c0fd5680 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Sat, 21 Oct 2023 11:33:49 +0530 Subject: [PATCH 24/33] Added the line back --- maths/perfect_number.py | 52 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 maths/perfect_number.py diff --git a/maths/perfect_number.py b/maths/perfect_number.py new file mode 100644 index 000000000000..04b3f9737868 --- /dev/null +++ b/maths/perfect_number.py @@ -0,0 +1,52 @@ +""" +== Perfect Number == +In number theory, a perfect number is a positive integer that is equal to the sum of +its positive divisors, excluding the number itself. +For example: 6 ==> divisors[1, 2, 3, 6] + Excluding 6, the sum(divisors) is 1 + 2 + 3 = 6 + So, 6 is a Perfect Number + +Other examples of Perfect Numbers: 28, 486, ... + +https://en.wikipedia.org/wiki/Perfect_number +""" + + +def perfect(number: int) -> bool: + """ + Check if a number is a perfect number. + + A perfect number is a positive integer that is equal to the sum of its proper + divisors (excluding itself). + + Args: + number (int): The number to be checked. + + Returns: + bool: True if the number is a perfect number, False otherwise. + Start from 1 because dividing by 0 will raise ZeroDivisionError. + A number at most can be divisible by the half of the number except the number + itself. For example, 6 is at most can be divisible by 3 except by 6 itself. + Examples: + >>> perfect(27) + False + >>> perfect(28) + True + >>> perfect(29) + False + >>> perfect(6) + True + >>> perfect(12) + False + >>> perfect(496) + True + >>> perfect(8128) + True + """ + return sum(i for i in range(1, number // 2 + 1) if number % i == 0) == number + + +if __name__ == "__main__": + print("Program to check whether a number is a Perfect number or not...") + number = int(input("Enter number: ").strip()) + print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.") From 974130bdf10be910f6373a1f80a8999aca10fda7 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee <69459134+imSanko@users.noreply.github.com> Date: Sat, 21 Oct 2023 11:45:21 +0530 Subject: [PATCH 25/33] Update maths/special_numbers/perfect_number.py Co-authored-by: Christian Clauss --- maths/special_numbers/perfect_number.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/maths/special_numbers/perfect_number.py b/maths/special_numbers/perfect_number.py index 9323fa28c215..160ab2d967ad 100644 --- a/maths/special_numbers/perfect_number.py +++ b/maths/special_numbers/perfect_number.py @@ -40,6 +40,11 @@ def perfect(number: int) -> bool: True >>> perfect(8128) True + >>> perfect(0) + >>> perfect(-3) + >>> perfect(12.34) + >>> perfect("day") + >>> perfect(["call"]) """ return sum(i for i in range(1, number // 2 + 1) if number % i == 0) == number From e1a5b17ab01a042a3baaea018cfdc5209925bf91 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Sat, 21 Oct 2023 16:29:27 +0530 Subject: [PATCH 26/33] Fixed a space --- maths/perfect_number.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/maths/perfect_number.py b/maths/perfect_number.py index 04b3f9737868..83482d0bc684 100644 --- a/maths/perfect_number.py +++ b/maths/perfect_number.py @@ -26,7 +26,7 @@ def perfect(number: int) -> bool: bool: True if the number is a perfect number, False otherwise. Start from 1 because dividing by 0 will raise ZeroDivisionError. A number at most can be divisible by the half of the number except the number - itself. For example, 6 is at most can be divisible by 3 except by 6 itself. + itself. For example, 6 is at most can be divisible by 3 except by 6 itself. Examples: >>> perfect(27) False @@ -43,10 +43,19 @@ def perfect(number: int) -> bool: >>> perfect(8128) True """ + if not isinstance(number, int) or number <= 0: + return False + return sum(i for i in range(1, number // 2 + 1) if number % i == 0) == number if __name__ == "__main__": print("Program to check whether a number is a Perfect number or not...") - number = int(input("Enter number: ").strip()) - print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.") + try: + number = int(input("Enter number: ").strip()) + if number == 0: + print("0 is not a perfect number.") + else: + print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.") + except ValueError: + print("Invalid input. Please enter a positive integer.") From 6ad025773f7911077efebb0569fb4ef9d74bcc26 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Sat, 21 Oct 2023 17:05:25 +0530 Subject: [PATCH 27/33] Updated --- maths/perfect_number.py | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/maths/perfect_number.py b/maths/perfect_number.py index 83482d0bc684..86a52681c7a7 100644 --- a/maths/perfect_number.py +++ b/maths/perfect_number.py @@ -24,9 +24,7 @@ def perfect(number: int) -> bool: Returns: bool: True if the number is a perfect number, False otherwise. - Start from 1 because dividing by 0 will raise ZeroDivisionError. - A number at most can be divisible by the half of the number except the number - itself. For example, 6 is at most can be divisible by 3 except by 6 itself. + Examples: >>> perfect(27) False @@ -43,19 +41,10 @@ def perfect(number: int) -> bool: >>> perfect(8128) True """ - if not isinstance(number, int) or number <= 0: - return False - return sum(i for i in range(1, number // 2 + 1) if number % i == 0) == number if __name__ == "__main__": print("Program to check whether a number is a Perfect number or not...") - try: - number = int(input("Enter number: ").strip()) - if number == 0: - print("0 is not a perfect number.") - else: - print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.") - except ValueError: - print("Invalid input. Please enter a positive integer.") + number = int(input("Enter number: ").strip()) + print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.") From 48c7f4b4e61b4dbbcdea84817236ab1d67006d51 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Sat, 21 Oct 2023 17:15:30 +0530 Subject: [PATCH 28/33] Reverted changes --- maths/perfect_number.py | 54 ++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/maths/perfect_number.py b/maths/perfect_number.py index 86a52681c7a7..9269f4547fc7 100644 --- a/maths/perfect_number.py +++ b/maths/perfect_number.py @@ -16,35 +16,35 @@ def perfect(number: int) -> bool: """ Check if a number is a perfect number. - A perfect number is a positive integer that is equal to the sum of its proper - divisors (excluding itself). - - Args: - number (int): The number to be checked. - - Returns: - bool: True if the number is a perfect number, False otherwise. - - Examples: - >>> perfect(27) - False - >>> perfect(28) - True - >>> perfect(29) - False - >>> perfect(6) - True - >>> perfect(12) - False - >>> perfect(496) - True - >>> perfect(8128) - True + A perfect number is a positive integer that is equal to the sum of its proper + divisors (excluding itself). + + Args: + number (int): The number to be checked. + + Returns: + bool: True if the number is a perfect number, False otherwise. + + Examples: + >>> perfect(27) + False + >>> perfect(28) + True + >>> perfect(29) + False + >>> perfect(6) + True + >>> perfect(12) + False + >>> perfect(496) + True + >>> perfect(8128) + True """ - return sum(i for i in range(1, number // 2 + 1) if number % i == 0) == number + return sum(i for i in range(1, ((number // 2) + 1)) if number % i == 0) == number if __name__ == "__main__": - print("Program to check whether a number is a Perfect number or not...") + print("Program to check whether a number is a Perfect number or not.......") number = int(input("Enter number: ").strip()) - print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.") + print(f"{number} is {'' if perfect(number) else 'not '} a Perfect Number.") From 6d23cbbdeb3cc9a50d8656280e7251aeb5fa2a75 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Sat, 21 Oct 2023 18:01:58 +0530 Subject: [PATCH 29/33] Added the old code and FIXED few LINES --- maths/perfect_number.py | 58 ++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/maths/perfect_number.py b/maths/perfect_number.py index 9269f4547fc7..6e81e1b6686d 100644 --- a/maths/perfect_number.py +++ b/maths/perfect_number.py @@ -16,35 +16,39 @@ def perfect(number: int) -> bool: """ Check if a number is a perfect number. - A perfect number is a positive integer that is equal to the sum of its proper - divisors (excluding itself). - - Args: - number (int): The number to be checked. - - Returns: - bool: True if the number is a perfect number, False otherwise. - - Examples: - >>> perfect(27) - False - >>> perfect(28) - True - >>> perfect(29) - False - >>> perfect(6) - True - >>> perfect(12) - False - >>> perfect(496) - True - >>> perfect(8128) - True + A perfect number is a positive integer that is equal to the sum of its proper + divisors (excluding itself). + + Args: + number (int): The number to be checked. + + Returns: + bool: True if the number is a perfect number, False otherwise. + + Examples: + >>> perfect(27) + False + >>> perfect(28) + True + >>> perfect(29) + False + >>> perfect(6) + True + >>> perfect(12) + False + >>> perfect(496) + True + >>> perfect(8128) + True + + Start from 1 because dividing by 0 will raise ZeroDivisionError. + A number at most can be divisible by the half of the number except the number + itself. For example, 6 is at most can be divisible by 3 except by 6 itself. """ - return sum(i for i in range(1, ((number // 2) + 1)) if number % i == 0) == number + return sum(i for i in range(1, number // 2 + 1) if number % i == 0) == number if __name__ == "__main__": - print("Program to check whether a number is a Perfect number or not.......") + print("Program to check whether a number is a Perfect number or not...") number = int(input("Enter number: ").strip()) - print(f"{number} is {'' if perfect(number) else 'not '} a Perfect Number.") + print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.") From 5f1b8ae8ca019196f4f40a6fa952bbb8737935a8 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Sat, 21 Oct 2023 18:33:28 +0530 Subject: [PATCH 30/33] Fixed few things --- maths/perfect_number.py | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/maths/perfect_number.py b/maths/perfect_number.py index 6e81e1b6686d..17971780a0de 100644 --- a/maths/perfect_number.py +++ b/maths/perfect_number.py @@ -14,36 +14,30 @@ def perfect(number: int) -> bool: """ - Check if a number is a perfect number. + Check if a number is a perfect number. A perfect number is a positive integer that is equal to the sum of its proper - divisors (excluding itself). - - Args: - number (int): The number to be checked. - - Returns: - bool: True if the number is a perfect number, False otherwise. - - Examples: + divisors (excluding itself) >>> perfect(27) False >>> perfect(28) True >>> perfect(29) False - >>> perfect(6) - True - >>> perfect(12) - False >>> perfect(496) True + >>> perfect(497) + False >>> perfect(8128) True + >>> perfect(8129) + False + >>> perfect(33550336) + True Start from 1 because dividing by 0 will raise ZeroDivisionError. A number at most can be divisible by the half of the number except the number - itself. For example, 6 is at most can be divisible by 3 except by 6 itself. + itself. For example, 6 is at most can be divisible by 3 except by 6 itself. """ return sum(i for i in range(1, number // 2 + 1) if number % i == 0) == number @@ -51,4 +45,5 @@ def perfect(number: int) -> bool: if __name__ == "__main__": print("Program to check whether a number is a Perfect number or not...") number = int(input("Enter number: ").strip()) - print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.") + is_perfect = perfect(number) + print(f"{number} is {'' if is_perfect else 'not '}a Perfect Number.") From 54fd69fd141f5bdb0cf61e2a608c5b2ec5acb250 Mon Sep 17 00:00:00 2001 From: Saptadeep Banerjee Date: Sat, 21 Oct 2023 18:55:35 +0530 Subject: [PATCH 31/33] Changed Test CASES --- maths/perfect_number.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/maths/perfect_number.py b/maths/perfect_number.py index 17971780a0de..8b530c6e430d 100644 --- a/maths/perfect_number.py +++ b/maths/perfect_number.py @@ -14,10 +14,6 @@ def perfect(number: int) -> bool: """ - Check if a number is a perfect number. - - A perfect number is a positive integer that is equal to the sum of its proper - divisors (excluding itself) >>> perfect(27) False >>> perfect(28) @@ -30,10 +26,6 @@ def perfect(number: int) -> bool: False >>> perfect(8128) True - >>> perfect(8129) - False - >>> perfect(33550336) - True Start from 1 because dividing by 0 will raise ZeroDivisionError. A number at most can be divisible by the half of the number except the number @@ -45,5 +37,4 @@ def perfect(number: int) -> bool: if __name__ == "__main__": print("Program to check whether a number is a Perfect number or not...") number = int(input("Enter number: ").strip()) - is_perfect = perfect(number) - print(f"{number} is {'' if is_perfect else 'not '}a Perfect Number.") + print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.") From 01e81c4003b8e5acb936788871c00f132fb203a6 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sat, 21 Oct 2023 23:50:38 +0200 Subject: [PATCH 32/33] Update perfect_number.py --- maths/perfect_number.py | 51 +++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/maths/perfect_number.py b/maths/perfect_number.py index 8b530c6e430d..c48569b806e9 100644 --- a/maths/perfect_number.py +++ b/maths/perfect_number.py @@ -14,27 +14,64 @@ def perfect(number: int) -> bool: """ + Check if a number is a perfect number. + + A perfect number is a positive integer that is equal to the sum of its proper + divisors (excluding itself). + + Args: + number: The number to be checked. + + Returns: + True if the number is a perfect number otherwise, False. + Start from 1 because dividing by 0 will raise ZeroDivisionError. + A number at most can be divisible by the half of the number except the number + itself. For example, 6 is at most can be divisible by 3 except by 6 itself. + Examples: >>> perfect(27) False >>> perfect(28) True >>> perfect(29) False - >>> perfect(496) + >>> perfect(6) True - >>> perfect(497) + >>> perfect(12) False + >>> perfect(496) + True >>> perfect(8128) True - - Start from 1 because dividing by 0 will raise ZeroDivisionError. - A number at most can be divisible by the half of the number except the number - itself. For example, 6 is at most can be divisible by 3 except by 6 itself. + >>> perfect(0) + False + >>> perfect(-1) + False + >>> perfect(12.34) + Traceback (most recent call last): + ... + ValueError: number must an integer + >>> perfect("Hello") + Traceback (most recent call last): + ... + ValueError: number must an integer """ + if not isinstance(number, int): + raise ValueError("number must an integer") + if number <= 0: + return False return sum(i for i in range(1, number // 2 + 1) if number % i == 0) == number if __name__ == "__main__": + from doctest import testmod + + testmod() print("Program to check whether a number is a Perfect number or not...") - number = int(input("Enter number: ").strip()) + try: + number = int(input("Enter a positive integer: ").strip()) + except ValueError: + msg = "number must an integer" + print(msg) + raise ValueError(msg) + print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.") From a355f82347f3f5d67f7de29ac158d2ff8532d569 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 21 Oct 2023 21:51:22 +0000 Subject: [PATCH 33/33] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/perfect_number.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/perfect_number.py b/maths/perfect_number.py index c48569b806e9..df6b6e3d91d8 100644 --- a/maths/perfect_number.py +++ b/maths/perfect_number.py @@ -64,7 +64,7 @@ def perfect(number: int) -> bool: if __name__ == "__main__": from doctest import testmod - + testmod() print("Program to check whether a number is a Perfect number or not...") try: