From 3a2112c0d8229d08a67656e02b6fde6d3a6275aa Mon Sep 17 00:00:00 2001 From: Devashri Deulkar <95555641+Devadeut@users.noreply.github.com> Date: Tue, 24 Oct 2023 09:05:10 +0530 Subject: [PATCH 01/16] Happy number (new algorithm) adding new algorithm --- maths/special_numbers/happy_number.py | 37 +++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 maths/special_numbers/happy_number.py diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py new file mode 100644 index 000000000000..b517585d0292 --- /dev/null +++ b/maths/special_numbers/happy_number.py @@ -0,0 +1,37 @@ +def is_happy_number(number: int) -> bool: + """ + Check if a number is a happy number. + https://en.wikipedia.org/wiki/Happy_number + A happy number is defined by the following process: + 1. Starting with any positive integer, replace the number by + the sum of the squares of its digits. + 2. Repeat the process until the number equals 1 (happy) or + it loops endlessly in a cycle (not happy). + + Args: + n (int): The number to check for happiness. + + Returns: + bool: True if the number is a happy number, False otherwise. + + Examples: + >>> is_happy_number(19) + True + >>> is_happy_number(4) + False + >>> is_happy_number(23) + True + """ + + # Create a set to store seen numbers and detect cycles + seen = set() + + while number != 1 and number not in seen: + seen.add(number) + number = sum(int(digit) ** 2 for digit in str(number)) + + return number == 1 +if __name__ == "__main__": + import doctest + + doctest.testmod() From 7047bf55de01608b16994a78c0852d058fca8d64 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 24 Oct 2023 03:37:06 +0000 Subject: [PATCH 02/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/special_numbers/happy_number.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index b517585d0292..ce99f80dd824 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -31,6 +31,8 @@ def is_happy_number(number: int) -> bool: number = sum(int(digit) ** 2 for digit in str(number)) return number == 1 + + if __name__ == "__main__": import doctest From 798774c6f281a1246cf327c55626ec6637c8413d Mon Sep 17 00:00:00 2001 From: Devashri Deulkar <95555641+Devadeut@users.noreply.github.com> Date: Mon, 30 Oct 2023 14:09:49 +0530 Subject: [PATCH 03/16] Update maths/special_numbers/happy_number.py Co-authored-by: Christian Clauss --- maths/special_numbers/happy_number.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index ce99f80dd824..7faeaad93d6e 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -21,6 +21,14 @@ def is_happy_number(number: int) -> bool: False >>> is_happy_number(23) True + >>> is_happy_number(0) + ? + >>> is_happy_number(-19) + ? + >>> is_happy_number(19.1) + ? + >>> is_happy_number("Happy") + ? """ # Create a set to store seen numbers and detect cycles From 5ebf0991c34f933af549ffa748f1a8ffd427a7d8 Mon Sep 17 00:00:00 2001 From: Devashri Deulkar <95555641+Devadeut@users.noreply.github.com> Date: Mon, 30 Oct 2023 14:21:51 +0530 Subject: [PATCH 04/16] Update happy_number.py added new changes --- maths/special_numbers/happy_number.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index 7faeaad93d6e..bfcb5572e3a8 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -2,14 +2,14 @@ def is_happy_number(number: int) -> bool: """ Check if a number is a happy number. https://en.wikipedia.org/wiki/Happy_number - A happy number is defined by the following process: + A happy number is defined by the following process: 1. Starting with any positive integer, replace the number by the sum of the squares of its digits. 2. Repeat the process until the number equals 1 (happy) or it loops endlessly in a cycle (not happy). Args: - n (int): The number to check for happiness. + number (int): The number to check for happiness. Returns: bool: True if the number is a happy number, False otherwise. @@ -22,13 +22,13 @@ def is_happy_number(number: int) -> bool: >>> is_happy_number(23) True >>> is_happy_number(0) - ? + False >>> is_happy_number(-19) - ? + False >>> is_happy_number(19.1) - ? + False >>> is_happy_number("Happy") - ? + False """ # Create a set to store seen numbers and detect cycles From 6c92c192b686cc47723d4a6f4665e1832ae16f24 Mon Sep 17 00:00:00 2001 From: Devashri Deulkar <95555641+Devadeut@users.noreply.github.com> Date: Mon, 30 Oct 2023 14:46:02 +0530 Subject: [PATCH 05/16] Update happy_number.py --- maths/special_numbers/happy_number.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index bfcb5572e3a8..5c73896ae7f3 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -1,4 +1,5 @@ -def is_happy_number(number: int) -> bool: + +def is_happy_number(number) -> bool: """ Check if a number is a happy number. https://en.wikipedia.org/wiki/Happy_number @@ -9,7 +10,7 @@ def is_happy_number(number: int) -> bool: it loops endlessly in a cycle (not happy). Args: - number (int): The number to check for happiness. + number (int or float): The number to check for happiness. Returns: bool: True if the number is a happy number, False otherwise. @@ -23,24 +24,24 @@ def is_happy_number(number: int) -> bool: True >>> is_happy_number(0) False - >>> is_happy_number(-19) - False >>> is_happy_number(19.1) False + >>> is_happy_number(-19) + False >>> is_happy_number("Happy") False """ - # Create a set to store seen numbers and detect cycles - seen = set() - - while number != 1 and number not in seen: - seen.add(number) - number = sum(int(digit) ** 2 for digit in str(number)) + # Check if the input is an integer or a float + if isinstance(number, (int)) and number > 0: + # Create a set to store seen numbers and detect cycles + seen = set() + while number != 1 and number not in seen: + seen.add(number) + number = sum(int(digit) ** 2 for digit in str(number)) return number == 1 - if __name__ == "__main__": import doctest From 24fdd2a77bee4193084422ed5f71429b715ed71b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 09:16:37 +0000 Subject: [PATCH 06/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/special_numbers/happy_number.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index 5c73896ae7f3..d7c47328e2b2 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -1,4 +1,3 @@ - def is_happy_number(number) -> bool: """ Check if a number is a happy number. @@ -42,6 +41,7 @@ def is_happy_number(number) -> bool: return number == 1 + if __name__ == "__main__": import doctest From aaa124c87e09243dad218550f60376b12c756dd6 Mon Sep 17 00:00:00 2001 From: Devashri Deulkar <95555641+Devadeut@users.noreply.github.com> Date: Mon, 30 Oct 2023 14:50:24 +0530 Subject: [PATCH 07/16] Update happy_number.py --- maths/special_numbers/happy_number.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index d7c47328e2b2..f76b4bbf1117 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -1,4 +1,4 @@ -def is_happy_number(number) -> bool: +def is_happy_number(number: int) -> bool: """ Check if a number is a happy number. https://en.wikipedia.org/wiki/Happy_number From b68ec006cbfb3dfd4154aa56a2b7d2bfc70f43bb Mon Sep 17 00:00:00 2001 From: Devashri Deulkar <95555641+Devadeut@users.noreply.github.com> Date: Mon, 30 Oct 2023 20:21:45 +0530 Subject: [PATCH 08/16] Update happy_number.py --- maths/special_numbers/happy_number.py | 28 ++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index f76b4bbf1117..d52f226ff817 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -1,3 +1,5 @@ +# Online Python compiler (interpreter) to run Python online. +# Write Python 3 code in this online editor and run it. def is_happy_number(number: int) -> bool: """ Check if a number is a happy number. @@ -9,7 +11,7 @@ def is_happy_number(number: int) -> bool: it loops endlessly in a cycle (not happy). Args: - number (int or float): The number to check for happiness. + number (int): The number to check for happiness. Returns: bool: True if the number is a happy number, False otherwise. @@ -22,26 +24,26 @@ def is_happy_number(number: int) -> bool: >>> is_happy_number(23) True >>> is_happy_number(0) - False + ValueError("number is not a positive integer") >>> is_happy_number(19.1) - False + ValueError("number is not a positive integer") >>> is_happy_number(-19) - False + ValueError("number is not a positive integer") >>> is_happy_number("Happy") - False + ValueError("number is not a positive integer") """ + + if not isinstance(number, int) or number <= 0: + raise ValueError("number is not a positive integer") - # Check if the input is an integer or a float - if isinstance(number, (int)) and number > 0: - # Create a set to store seen numbers and detect cycles - seen = set() - while number != 1 and number not in seen: - seen.add(number) - number = sum(int(digit) ** 2 for digit in str(number)) + # Create a set to store seen numbers and detect cycles + seen = set() + while number != 1 and number not in seen: + seen.add(number) + number = sum(int(digit) ** 2 for digit in str(number)) return number == 1 - if __name__ == "__main__": import doctest From bde4c22299bb5239128069e505ff841e4e792add Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 14:54:04 +0000 Subject: [PATCH 09/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/special_numbers/happy_number.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index d52f226ff817..f3a7c60f6d42 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -32,7 +32,7 @@ def is_happy_number(number: int) -> bool: >>> is_happy_number("Happy") ValueError("number is not a positive integer") """ - + if not isinstance(number, int) or number <= 0: raise ValueError("number is not a positive integer") @@ -44,6 +44,7 @@ def is_happy_number(number: int) -> bool: return number == 1 + if __name__ == "__main__": import doctest From 21e5168b596f9ffc8353e2fef4679564bbbe027a Mon Sep 17 00:00:00 2001 From: Devashri Deulkar <95555641+Devadeut@users.noreply.github.com> Date: Mon, 30 Oct 2023 20:29:39 +0530 Subject: [PATCH 10/16] Update happy_number.py --- maths/special_numbers/happy_number.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index f3a7c60f6d42..aab6f0f414ee 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -1,5 +1,4 @@ -# Online Python compiler (interpreter) to run Python online. -# Write Python 3 code in this online editor and run it. + def is_happy_number(number: int) -> bool: """ Check if a number is a happy number. From 715d5639dd1fde6d5b0028d07824f5fd4f75865b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 15:00:36 +0000 Subject: [PATCH 11/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/special_numbers/happy_number.py | 1 - 1 file changed, 1 deletion(-) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index aab6f0f414ee..ff5b480d8e65 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -1,4 +1,3 @@ - def is_happy_number(number: int) -> bool: """ Check if a number is a happy number. From 6c726c19c1a4e762fe7baeb71f626bb4b31feddf Mon Sep 17 00:00:00 2001 From: Devashri Deulkar <95555641+Devadeut@users.noreply.github.com> Date: Mon, 30 Oct 2023 20:45:35 +0530 Subject: [PATCH 12/16] Update happy_number.py added ValueError part in code --- maths/special_numbers/happy_number.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index ff5b480d8e65..d4ed2628f796 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -21,14 +21,7 @@ def is_happy_number(number: int) -> bool: False >>> is_happy_number(23) True - >>> is_happy_number(0) - ValueError("number is not a positive integer") - >>> is_happy_number(19.1) - ValueError("number is not a positive integer") - >>> is_happy_number(-19) - ValueError("number is not a positive integer") - >>> is_happy_number("Happy") - ValueError("number is not a positive integer") + """ if not isinstance(number, int) or number <= 0: From 17b6343614d53b28f10e6acba5acf456db4d259f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 15:16:15 +0000 Subject: [PATCH 13/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/special_numbers/happy_number.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index d4ed2628f796..8bb9463b771b 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -21,7 +21,7 @@ def is_happy_number(number: int) -> bool: False >>> is_happy_number(23) True - + """ if not isinstance(number, int) or number <= 0: From f55247e5f14bcf16663dafa84d48923c2f6a7359 Mon Sep 17 00:00:00 2001 From: Devashri Deulkar <95555641+Devadeut@users.noreply.github.com> Date: Mon, 30 Oct 2023 22:04:14 +0530 Subject: [PATCH 14/16] Update happy_number.py modified and added raise Error code --- maths/special_numbers/happy_number.py | 58 +++++++++++++++++---------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index 8bb9463b771b..9e48efc4474a 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -1,41 +1,57 @@ def is_happy_number(number: int) -> bool: """ Check if a number is a happy number. - https://en.wikipedia.org/wiki/Happy_number - A happy number is defined by the following process: - 1. Starting with any positive integer, replace the number by - the sum of the squares of its digits. - 2. Repeat the process until the number equals 1 (happy) or - it loops endlessly in a cycle (not happy). + + :param number: The number to check for happiness. + :return: True if the number is a happy number, False otherwise. + + A happy number is a number which eventually reaches 1 when replaced by the sum of the square of each digit. - Args: - number (int): The number to check for happiness. - - Returns: - bool: True if the number is a happy number, False otherwise. - - Examples: >>> is_happy_number(19) True - >>> is_happy_number(4) + >>> is_happy_number(2) False >>> is_happy_number(23) True - + >>> is_happy_number(1) + True + >>> is_happy_number(0) + Traceback (most recent call last): + ... + ValueError: Input must be a positive integer + >>> is_happy_number(-19) + Traceback (most recent call last): + ... + ValueError: Input must be a positive integer + >>> is_happy_number(19.1) + Traceback (most recent call last): + ... + TypeError: Input value of [number=19.1] must be an integer + >>> is_happy_number("happy") + Traceback (most recent call last): + ... + TypeError: Input value of [number=happy] must be an integer """ + if not isinstance(number, int): + msg = f"Input value of [number={number}] must be an integer" + raise TypeError(msg) + if number <= 0: + raise ValueError("Input must be a positive integer") + + def get_next(number): + next_num = 0 + while number > 0: + number, digit = divmod(number, 10) + next_num += digit ** 2 + return next_num - if not isinstance(number, int) or number <= 0: - raise ValueError("number is not a positive integer") - - # Create a set to store seen numbers and detect cycles seen = set() while number != 1 and number not in seen: seen.add(number) - number = sum(int(digit) ** 2 for digit in str(number)) + number = get_next(number) return number == 1 - if __name__ == "__main__": import doctest From b9dde2d6cb97dee813dd18753f8f57c62b1523d0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 16:35:42 +0000 Subject: [PATCH 15/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/special_numbers/happy_number.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index 9e48efc4474a..9297ee9f6050 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -1,10 +1,10 @@ def is_happy_number(number: int) -> bool: """ Check if a number is a happy number. - + :param number: The number to check for happiness. :return: True if the number is a happy number, False otherwise. - + A happy number is a number which eventually reaches 1 when replaced by the sum of the square of each digit. >>> is_happy_number(19) @@ -37,12 +37,12 @@ def is_happy_number(number: int) -> bool: raise TypeError(msg) if number <= 0: raise ValueError("Input must be a positive integer") - + def get_next(number): next_num = 0 while number > 0: number, digit = divmod(number, 10) - next_num += digit ** 2 + next_num += digit**2 return next_num seen = set() @@ -52,6 +52,7 @@ def get_next(number): return number == 1 + if __name__ == "__main__": import doctest From 420e2531a87ed70d9eb44e0badb9d942deed8a3a Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Mon, 30 Oct 2023 19:12:02 +0100 Subject: [PATCH 16/16] Update happy_number.py --- maths/special_numbers/happy_number.py | 31 +++++++++------------------ 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/maths/special_numbers/happy_number.py b/maths/special_numbers/happy_number.py index 9297ee9f6050..eac3167e304b 100644 --- a/maths/special_numbers/happy_number.py +++ b/maths/special_numbers/happy_number.py @@ -1,12 +1,11 @@ def is_happy_number(number: int) -> bool: """ - Check if a number is a happy number. + A happy number is a number which eventually reaches 1 when replaced by the sum of + the square of each digit. :param number: The number to check for happiness. :return: True if the number is a happy number, False otherwise. - A happy number is a number which eventually reaches 1 when replaced by the sum of the square of each digit. - >>> is_happy_number(19) True >>> is_happy_number(2) @@ -18,38 +17,28 @@ def is_happy_number(number: int) -> bool: >>> is_happy_number(0) Traceback (most recent call last): ... - ValueError: Input must be a positive integer + ValueError: number=0 must be a positive integer >>> is_happy_number(-19) Traceback (most recent call last): ... - ValueError: Input must be a positive integer + ValueError: number=-19 must be a positive integer >>> is_happy_number(19.1) Traceback (most recent call last): ... - TypeError: Input value of [number=19.1] must be an integer + ValueError: number=19.1 must be a positive integer >>> is_happy_number("happy") Traceback (most recent call last): ... - TypeError: Input value of [number=happy] must be an integer + ValueError: number='happy' must be a positive integer """ - if not isinstance(number, int): - msg = f"Input value of [number={number}] must be an integer" - raise TypeError(msg) - if number <= 0: - raise ValueError("Input must be a positive integer") - - def get_next(number): - next_num = 0 - while number > 0: - number, digit = divmod(number, 10) - next_num += digit**2 - return next_num + if not isinstance(number, int) or number <= 0: + msg = f"{number=} must be a positive integer" + raise ValueError(msg) seen = set() while number != 1 and number not in seen: seen.add(number) - number = get_next(number) - + number = sum(int(digit) ** 2 for digit in str(number)) return number == 1