Finding Kaprekar's constant 6174 with Python

#python

Numberphile once did a fascinating video about the number 6174. The video describes a simple, iterative algorithm which you can feed almost any 4-digit number, and within seven iterations it will always produce 6174. This number is known as Kaprekar’s constant, after the mathematician Kaprekar.

I thought this was so cool I wanted to try to implement the algorithm, which is known as Kaprekars routine, in Python:

KAPREKAR_CONSTANT = 6174

def kaprekar_map(nbr):
    """Return the Kaprekar mapping of nbr."""
    parts = sorted("%04d" % nbr)
    low, high = [int("".join(x)) for x in [parts, reversed(parts)]]
    return high - low

def kaprekar_steps(nbr, verbose=False):
    """Return steps to reach 6174 from nbr, or -1 if impossible."""
    maxsteps = 7
    current = nbr
    for step in range(maxsteps):
        if current == KAPREKAR_CONSTANT:
            return step
        if current < 0:
            return -1
        previous, current = current, kaprekar_map(current)
        if verbose:
            print("%04d -> %04d" % (previous, current))
    return -1

So if you want to know the number of steps to 6174 for each number 0000-9999 you can do

[(x,kaprekar_steps(x)) for x in range(0,10000)]

kaprekar_steps returns -1 if there is no path to 6174 from that number. This will happen for 0000, 1111, 2222, 3333, …, and so on. This is expected and explained in the video

If you call kaprekar_steps with verbose=True then you also get a printout showing every step of the way to 6174. For example, here’s the output from calling kaprekar_steps(9,True):

0009 -> 8991
8991 -> 8082
8082 -> 8532
8532 -> 6174
4