I'm trying to make an easy script in Python which takes a number and saves in a variable, sorting the digits in ascending and descending orders and saving both in separate variables. Implementing Kaprekar's constant.
It's probably a pretty noobish question. But I'm new to this and I couldn't find anything on Google that could help me. A site I found tried to explain a way using lists, but it didn't work out very well.
Sort the digits in ascending and descending orders:
ascending = "".join(sorted(str(number)))
descending = "".join(sorted(str(number), reverse=True))
Like this:
>>> number = 5896
>>> ascending = "".join(sorted(str(number)))
>>>
>>> descending = "".join(sorted(str(number), reverse=True))
>>> ascending
'5689'
>>> descending
'9865'
And if you need them to be numbers again (not just strings), call int()
on them:
>>> int(ascending)
5689
>>> int(descending)
9865
2020-01-30
>>> def kaprekar(number):
... diff = None
... while diff != 0:
... ascending = "".join(sorted(str(number)))
... descending = "".join(sorted(str(number), reverse=True))
... print(ascending, descending)
... next_number = int(descending) - int(ascending)
... diff = number - next_number
... number = next_number
...
>>> kaprekar(2777)
2777 7772
4599 9954
3555 5553
1899 9981
0288 8820
2358 8532
1467 7641
>>> x = [4,5,81,5,28958,28] # first list
>>> print sorted(x)
[4, 5, 5, 28, 81, 28958]
>>> x
[4, 5, 81, 5, 28958, 28]
>>> x.sort() # sort the list in place
>>> x
[4, 5, 5, 28, 81, 28958]
>>> x.append(1) # add to the list
>>> x
[4, 5, 5, 28, 81, 28958, 1]
>>> sorted(x)
[1, 4, 5, 5, 28, 81, 28958]
As many others have pointed out, you can sort a number forwards like:
>>> int(''.join(sorted(str(2314))))
1234
That's pretty much the most standard way.
Reverse a number? Doesn't work well in a number with trailing zeros.
>>> y = int(''.join(sorted(str(2314))))
>>> y
1234
>>> int(str(y)[::-1])
4321
The [::-1]
notation indicates that the iterable is to be traversed in reverse order.
As Mark Rushakoff already mentioned (but didn't solve) in his answer, str(n)
doesn't handle numeric n
with leading zeros, which you need for Kaprekar's operation. hughdbrown's answer similarly doesn't work with leading zeros.
One way to make sure you have a four-character string is to use the zfill
string method. For example:
>>> n = 2
>>> str(n)
'2'
>>> str(n).zfill(4)
'0002'
You should also be aware that in versions of Python prior to 3, a leading zero in a numeric literal indicated octal:
>>> str(0043)
'35'
>>> str(0378)
File "<stdin>", line 1
str(0378)
^
SyntaxError: invalid token
In Python 3, 0043
is not a valid numeric literal at all.
I don't know the python syntax, but thinking the generically, I would convert the input string into a character array, they do a sort on the character array, and lastly pipe it out.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With