Skip to content

Commit 9b1d4e1

Browse files
Update kaprekar_constant.py
1 parent ce04955 commit 9b1d4e1

1 file changed

Lines changed: 14 additions & 18 deletions

File tree

scripts/maths/kaprekar_constant.py

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,39 @@
11
def kaprekar_routine(number: int) -> int:
22
"""
3-
Find steps to Kaprekar constant (6174) bro.
4-
Link: https://wikipedia.org
3+
Calculates the number of steps required to reach Kaprekar's constant (6174).
4+
Link: https://en.wikipedia.org/wiki/6174
55
66
>>> kaprekar_routine(3524)
77
3
88
>>> kaprekar_routine(6174)
99
0
1010
"""
1111

12-
# Checking if the number is 4 digits, throwing an error if not bro
12+
# Ensure the input is a 4-digit positive integer
1313
if not (1000 <= number <= 9999):
14-
raise ValueError("The number must be 4 digits bro!")
14+
raise ValueError("The number must be a 4-digit integer.")
1515

16-
# If someone enters all same digits like 1111, loop breaks. Blocking it here
16+
# Prevent repdigits (e.g., 1111) which result in zero and cause infinite loops
1717
if len(set(str(number))) < 2:
18-
raise ValueError(
19-
"Digits cannot be all the same bro, make at least two different!"
20-
)
18+
raise ValueError("The number must contain at least two distinct digits.")
2119

2220
kaprekar_target = 6174
2321
steps = 0
2422

25-
# We are here until the number becomes 6174 bro, loop keeps spinning
23+
# Iterate until the number reaches Kaprekar's constant
2624
while number != kaprekar_target:
27-
# Padding the number to 4 digits and making it a string bro
25+
# Zero-pad the number to ensure a 4-digit string representation
2826
digits = f"{number:04d}"
2927

30-
# Sorting digits from biggest to smallest and joining them
28+
# Sort digits in descending and ascending order
3129
descending = int("".join(sorted(digits, reverse=True)))
32-
33-
# Sorting digits from smallest to biggest and joining them
3430
ascending = int("".join(sorted(digits)))
3531

36-
# Subtracting smallest from biggest, finding new number and increasing steps bro
32+
# Subtract smaller number from larger number to get the next iteration
3733
number = descending - ascending
3834
steps += 1
3935

40-
# Infinite loop protection just in case we break something, spins 7 times max
36+
# Safety check: Kaprekar's routine always reaches 6174 in at most 7 steps
4137
if steps > 7:
4238
break
4339

@@ -47,8 +43,8 @@ def kaprekar_routine(number: int) -> int:
4743
if __name__ == "__main__":
4844
import doctest
4945

50-
# Running the test engine that the bots are checking
46+
# Execute automated doctests
5147
doctest.testmod()
5248

53-
# Just a small example here to test it for myself
54-
print(f"Our number locked in exactly {kaprekar_routine(3524)} steps bro!")
49+
# Sample execution
50+
print(f"Iterations required: {kaprekar_routine(3524)}")

0 commit comments

Comments
 (0)