From cd7e7242ecc88bd655ebebdbe6f5a033f0c3733e Mon Sep 17 00:00:00 2001 From: Sean-Randall <166264296+Sean-Randall@users.noreply.github.com> Date: Sat, 10 May 2025 21:09:24 -0400 Subject: [PATCH 01/13] Add Kaprekar number checker to special_numbers --- maths/special_numbers/kaprekar_number.py | 35 ++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 maths/special_numbers/kaprekar_number.py diff --git a/maths/special_numbers/kaprekar_number.py b/maths/special_numbers/kaprekar_number.py new file mode 100644 index 000000000000..a3b4cc586918 --- /dev/null +++ b/maths/special_numbers/kaprekar_number.py @@ -0,0 +1,35 @@ +def is_kaprekar_number(n: int) -> bool: + """ + Determine whether a number is a Kaprekar number. + + A Kaprekar number is one where the square can be split into parts + that sum to the original number. + + Args: + n (int): The number to check. + + Returns: + bool: True if it's a Kaprekar number, else False. + + Examples: + >>> is_kaprekar_number(45) + True + >>> is_kaprekar_number(9) + True + >>> is_kaprekar_number(10) + False + """ + square = str(n ** 2) + for i in range(1, len(square)): + left, right = square[:i], square[i:] + if int(right) == 0: + continue + if n == int(left or "0") + int(right): + return True + return n == 1 + + +if __name__ == "__main__": + import doctest + + doctest.testmod() From 7692d03294ca0242e9140cc97ba8e3289b6b604d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 11 May 2025 01:13:32 +0000 Subject: [PATCH 02/13] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/special_numbers/kaprekar_number.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maths/special_numbers/kaprekar_number.py b/maths/special_numbers/kaprekar_number.py index a3b4cc586918..b34e6ab48dc9 100644 --- a/maths/special_numbers/kaprekar_number.py +++ b/maths/special_numbers/kaprekar_number.py @@ -19,7 +19,7 @@ def is_kaprekar_number(n: int) -> bool: >>> is_kaprekar_number(10) False """ - square = str(n ** 2) + square = str(n**2) for i in range(1, len(square)): left, right = square[:i], square[i:] if int(right) == 0: @@ -31,5 +31,5 @@ def is_kaprekar_number(n: int) -> bool: if __name__ == "__main__": import doctest - + doctest.testmod() From 9ed325d592d47a5d6b51fb88e81c308efe2b335c Mon Sep 17 00:00:00 2001 From: Sean-Randall <166264296+Sean-Randall@users.noreply.github.com> Date: Sun, 11 May 2025 01:32:07 -0400 Subject: [PATCH 03/13] Fix: Clean whitespace and formatting --- maths/special_numbers/kaprekar_number.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/maths/special_numbers/kaprekar_number.py b/maths/special_numbers/kaprekar_number.py index b34e6ab48dc9..a1eee0def909 100644 --- a/maths/special_numbers/kaprekar_number.py +++ b/maths/special_numbers/kaprekar_number.py @@ -31,5 +31,4 @@ def is_kaprekar_number(n: int) -> bool: if __name__ == "__main__": import doctest - - doctest.testmod() + doctest.testmod() \ No newline at end of file From 50193cd913dcdc683fa6f8e14ca6332c91381f3e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 11 May 2025 05:41:37 +0000 Subject: [PATCH 04/13] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/special_numbers/kaprekar_number.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/maths/special_numbers/kaprekar_number.py b/maths/special_numbers/kaprekar_number.py index a1eee0def909..b34e6ab48dc9 100644 --- a/maths/special_numbers/kaprekar_number.py +++ b/maths/special_numbers/kaprekar_number.py @@ -31,4 +31,5 @@ def is_kaprekar_number(n: int) -> bool: if __name__ == "__main__": import doctest - doctest.testmod() \ No newline at end of file + + doctest.testmod() From e523f998bd95aba96c4a814f46d94280484e4e41 Mon Sep 17 00:00:00 2001 From: Sean-Randall <166264296+Sean-Randall@users.noreply.github.com> Date: Sun, 11 May 2025 22:48:20 -0400 Subject: [PATCH 05/13] Clarified Kaprekar number definition and excluded powers of 10 (e.g., 10, 100) --- maths/special_numbers/kaprekar_number.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/maths/special_numbers/kaprekar_number.py b/maths/special_numbers/kaprekar_number.py index b34e6ab48dc9..546872bcfeae 100644 --- a/maths/special_numbers/kaprekar_number.py +++ b/maths/special_numbers/kaprekar_number.py @@ -1,9 +1,10 @@ def is_kaprekar_number(n: int) -> bool: """ - Determine whether a number is a Kaprekar number. + Determine whether a number is a Kaprekar number (excluding powers of 10). - A Kaprekar number is one where the square can be split into parts - that sum to the original number. + A Kaprekar number is a positive number n such that: + n^2 = q * 10^m + r, for some m >= 1, q >= 0, 0 <= r < 10^m, + and n = q + r, with the restriction that n is not a power of 10. Args: n (int): The number to check. @@ -18,18 +19,19 @@ def is_kaprekar_number(n: int) -> bool: True >>> is_kaprekar_number(10) False + >>> is_kaprekar_number(1) + True """ - square = str(n**2) + if n == 1: + return True + if n <= 0 or (n % 10 == 0 and n == 10 ** len(str(n))): + return False # Disallow powers of 10 (e.g., 10, 100) + + square = str(n ** 2) for i in range(1, len(square)): left, right = square[:i], square[i:] if int(right) == 0: continue if n == int(left or "0") + int(right): return True - return n == 1 - - -if __name__ == "__main__": - import doctest - - doctest.testmod() + return False From 322ed124abb3aa7c5cdbc3bdda3adc99927e1871 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 02:48:49 +0000 Subject: [PATCH 06/13] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/special_numbers/kaprekar_number.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/special_numbers/kaprekar_number.py b/maths/special_numbers/kaprekar_number.py index 546872bcfeae..cea1f8aeda2e 100644 --- a/maths/special_numbers/kaprekar_number.py +++ b/maths/special_numbers/kaprekar_number.py @@ -27,7 +27,7 @@ def is_kaprekar_number(n: int) -> bool: if n <= 0 or (n % 10 == 0 and n == 10 ** len(str(n))): return False # Disallow powers of 10 (e.g., 10, 100) - square = str(n ** 2) + square = str(n**2) for i in range(1, len(square)): left, right = square[:i], square[i:] if int(right) == 0: From c33f100378ef8f742aa19351ea7b76463f7d9974 Mon Sep 17 00:00:00 2001 From: Sean-Randall <166264296+Sean-Randall@users.noreply.github.com> Date: Mon, 12 May 2025 21:56:42 -0400 Subject: [PATCH 07/13] Remove redundant check for int(right) == 0 after excluding powers of 10 --- maths/special_numbers/kaprekar_number.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/maths/special_numbers/kaprekar_number.py b/maths/special_numbers/kaprekar_number.py index 546872bcfeae..dc3f7899a6ba 100644 --- a/maths/special_numbers/kaprekar_number.py +++ b/maths/special_numbers/kaprekar_number.py @@ -30,8 +30,6 @@ def is_kaprekar_number(n: int) -> bool: square = str(n ** 2) for i in range(1, len(square)): left, right = square[:i], square[i:] - if int(right) == 0: - continue if n == int(left or "0") + int(right): return True return False From 15c2bac17567a6e9e91007e4c91c67d1c267bb58 Mon Sep 17 00:00:00 2001 From: Sean-Randall <166264296+Sean-Randall@users.noreply.github.com> Date: Mon, 12 May 2025 22:18:05 -0400 Subject: [PATCH 08/13] Fix Kaprekar logic to exclude powers of 10; add passing tests --- maths/special_numbers/kaprekar_number.py | 8 +++++--- tests/special_numbers/test_kaprekar_number.py | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 tests/special_numbers/test_kaprekar_number.py diff --git a/maths/special_numbers/kaprekar_number.py b/maths/special_numbers/kaprekar_number.py index a3a3b5bc6fd3..3eec425fc780 100644 --- a/maths/special_numbers/kaprekar_number.py +++ b/maths/special_numbers/kaprekar_number.py @@ -1,3 +1,5 @@ +import math + def is_kaprekar_number(n: int) -> bool: """ Determine whether a number is a Kaprekar number (excluding powers of 10). @@ -24,10 +26,10 @@ def is_kaprekar_number(n: int) -> bool: """ if n == 1: return True - if n <= 0 or (n % 10 == 0 and n == 10 ** len(str(n))): - return False # Disallow powers of 10 (e.g., 10, 100) + if n <= 0 or math.log10(n).is_integer(): + return False # Disallow powers of 10 (e.g., 10, 100, 1000) - square = str(n**2) + square = str(n ** 2) for i in range(1, len(square)): left, right = square[:i], square[i:] if n == int(left or "0") + int(right): diff --git a/tests/special_numbers/test_kaprekar_number.py b/tests/special_numbers/test_kaprekar_number.py new file mode 100644 index 000000000000..0abe5d75efea --- /dev/null +++ b/tests/special_numbers/test_kaprekar_number.py @@ -0,0 +1,17 @@ +from maths.special_numbers.kaprekar_number import is_kaprekar_number + +def test_kaprekar_numbers(): + assert is_kaprekar_number(1) is True + assert is_kaprekar_number(9) is True + assert is_kaprekar_number(45) is True + assert is_kaprekar_number(55) is True + assert is_kaprekar_number(99) is True + assert is_kaprekar_number(297) is True + +def test_non_kaprekar_numbers(): + assert is_kaprekar_number(10) is False # Power of 10 + assert is_kaprekar_number(100) is False # Power of 10 + assert is_kaprekar_number(3) is False + assert is_kaprekar_number(50) is False + assert is_kaprekar_number(0) is False + assert is_kaprekar_number(-45) is False From 80b7535905220987c568261aea8f123076966641 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 13 May 2025 02:18:31 +0000 Subject: [PATCH 09/13] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/special_numbers/kaprekar_number.py | 3 ++- tests/special_numbers/test_kaprekar_number.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/maths/special_numbers/kaprekar_number.py b/maths/special_numbers/kaprekar_number.py index 3eec425fc780..349bcf87f34a 100644 --- a/maths/special_numbers/kaprekar_number.py +++ b/maths/special_numbers/kaprekar_number.py @@ -1,5 +1,6 @@ import math + def is_kaprekar_number(n: int) -> bool: """ Determine whether a number is a Kaprekar number (excluding powers of 10). @@ -29,7 +30,7 @@ def is_kaprekar_number(n: int) -> bool: if n <= 0 or math.log10(n).is_integer(): return False # Disallow powers of 10 (e.g., 10, 100, 1000) - square = str(n ** 2) + square = str(n**2) for i in range(1, len(square)): left, right = square[:i], square[i:] if n == int(left or "0") + int(right): diff --git a/tests/special_numbers/test_kaprekar_number.py b/tests/special_numbers/test_kaprekar_number.py index 0abe5d75efea..76e76c2cd0cc 100644 --- a/tests/special_numbers/test_kaprekar_number.py +++ b/tests/special_numbers/test_kaprekar_number.py @@ -1,5 +1,6 @@ from maths.special_numbers.kaprekar_number import is_kaprekar_number + def test_kaprekar_numbers(): assert is_kaprekar_number(1) is True assert is_kaprekar_number(9) is True @@ -8,6 +9,7 @@ def test_kaprekar_numbers(): assert is_kaprekar_number(99) is True assert is_kaprekar_number(297) is True + def test_non_kaprekar_numbers(): assert is_kaprekar_number(10) is False # Power of 10 assert is_kaprekar_number(100) is False # Power of 10 From d15924598957537b3cfc3a34236b3fea2318987b Mon Sep 17 00:00:00 2001 From: Sean-Randall <166264296+Sean-Randall@users.noreply.github.com> Date: Mon, 12 May 2025 22:25:13 -0400 Subject: [PATCH 10/13] Trigger CI rerun From 1dd98c2c0ecebb4117fe6f322c8092de37eef65e Mon Sep 17 00:00:00 2001 From: Sean-Randall <166264296+Sean-Randall@users.noreply.github.com> Date: Mon, 12 May 2025 22:29:11 -0400 Subject: [PATCH 11/13] Apply Ruff style fixes after renaming parameter --- maths/special_numbers/kaprekar_number.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/maths/special_numbers/kaprekar_number.py b/maths/special_numbers/kaprekar_number.py index 349bcf87f34a..00a96c63ff53 100644 --- a/maths/special_numbers/kaprekar_number.py +++ b/maths/special_numbers/kaprekar_number.py @@ -1,16 +1,16 @@ import math -def is_kaprekar_number(n: int) -> bool: +def is_kaprekar_number(number: int) -> bool: """ Determine whether a number is a Kaprekar number (excluding powers of 10). - A Kaprekar number is a positive number n such that: - n^2 = q * 10^m + r, for some m >= 1, q >= 0, 0 <= r < 10^m, - and n = q + r, with the restriction that n is not a power of 10. + A Kaprekar number is a positive number such that: + number^2 = q * 10^m + r, for some m >= 1, q >= 0, 0 <= r < 10^m, + and number = q + r, with the restriction that it is not a power of 10. Args: - n (int): The number to check. + number (int): The number to check. Returns: bool: True if it's a Kaprekar number, else False. @@ -25,14 +25,14 @@ def is_kaprekar_number(n: int) -> bool: >>> is_kaprekar_number(1) True """ - if n == 1: + if number == 1: return True - if n <= 0 or math.log10(n).is_integer(): + if number <= 0 or math.log10(number).is_integer(): return False # Disallow powers of 10 (e.g., 10, 100, 1000) - square = str(n**2) + square = str(number ** 2) for i in range(1, len(square)): left, right = square[:i], square[i:] - if n == int(left or "0") + int(right): + if number == int(left or "0") + int(right): return True return False From c59e0c8cd2d45cec883692d1d7c861b43c987d3b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 13 May 2025 02:29:36 +0000 Subject: [PATCH 12/13] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/special_numbers/kaprekar_number.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/special_numbers/kaprekar_number.py b/maths/special_numbers/kaprekar_number.py index 00a96c63ff53..c62e901207a4 100644 --- a/maths/special_numbers/kaprekar_number.py +++ b/maths/special_numbers/kaprekar_number.py @@ -30,7 +30,7 @@ def is_kaprekar_number(number: int) -> bool: if number <= 0 or math.log10(number).is_integer(): return False # Disallow powers of 10 (e.g., 10, 100, 1000) - square = str(number ** 2) + square = str(number**2) for i in range(1, len(square)): left, right = square[:i], square[i:] if number == int(left or "0") + int(right): From 597e0f09d5dac6359299534fff09a8df2e0e52ce Mon Sep 17 00:00:00 2001 From: Sean-Randall <166264296+Sean-Randall@users.noreply.github.com> Date: Mon, 12 May 2025 22:31:55 -0400 Subject: [PATCH 13/13] Add __init__.py to fix Ruff INP001 implicit namespace error --- tests/special_numbers/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/special_numbers/__init__.py diff --git a/tests/special_numbers/__init__.py b/tests/special_numbers/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1