26 lines
951 B
Python
26 lines
951 B
Python
def closest_more_than(n, lst):
|
|
"(index of) closest int from lst, to n that is also > n"
|
|
large = max(lst) + 1
|
|
return lst.index(min(lst, key=lambda x: (large if x <= n else x)))
|
|
|
|
def nexthigh(n):
|
|
"Return nxt highest number from n's digits using scan & re-order"
|
|
assert n == int(abs(n)), "n >= 0"
|
|
this = list(int(digit) for digit in str(int(n)))[::-1]
|
|
mx = this[0]
|
|
for i, digit in enumerate(this[1:], 1):
|
|
if digit < mx:
|
|
mx_index = closest_more_than(digit, this[:i + 1])
|
|
this[mx_index], this[i] = this[i], this[mx_index]
|
|
this[:i] = sorted(this[:i], reverse=True)
|
|
return int(''.join(str(d) for d in this[::-1]))
|
|
elif digit > mx:
|
|
mx, mx_index = digit, i
|
|
return 0
|
|
|
|
|
|
if __name__ == '__main__':
|
|
for x in [0, 9, 12, 21, 12453, 738440, 45072010, 95322020,
|
|
9589776899767587796600]:
|
|
print(f"{x:>12_d} -> {nexthigh(x):>12_d}")
|