nokados
Можешь объяснить, как она работает?
нет ( в смысле мне действительно сложно это сделать)
nokados
И, кстати - работает не всегда верно
на каких данных? на первых 100000 все ок
from functools import reduce
R = lambda f : (lambda hR : hR(hR))(lambda r : lambda d, *a : f(r(r), *(tuple(reversed(divmod(d, 10))) + a)))
ns = R(lambda self, x, xs: xs and x + self(xs) or x)
fast_next = lambda n : (R(lambda self, x, xs, o, ts :
x and (lambda nxs : nxs + (lambda nn, nh : reduce(lambda res, n : res*10 + n,
[nh] + [9]*nn,
0))
(*divmod(ns(xs) - ns(nxs) + ts + x, 9)))
((xs+1)*o*10) or self(xs, o*10, ts+x)))(n, 1, 0)
def slow_next(n):
ns = lambda n : sum(map(int, str(n)))
nsum = ns(n)
n+=1
while ns(n) != nsum:
n+=1
return n
def isem_next(N):
s = [0]+list( map(int, str(N)))
ind = len(s) - 1
for adder in (-1, 1):
while 2*s[ind] == 9*(adder+1): ind -= 1
s[ind] += adder
ind += adder
s = s[:ind] + sorted(s[ind:])
M = int(''.join( map(str,s)))
return M
for n in range(1,100000):
by_slow, by_fast, by_isem = slow_next(n), fast_next(n), isem_next(n)
assert by_slow == by_fast == by_isem, 'FAIL at {}: {},{},{} '.format(n, by_slow, by_fast, by_isem)