from collections import Counter
n, m = input().split()


def nearest(sa, sb):
    if sa == "":
        return ""
    if len(sb) < len(sa):
        return ''.join(sorted(sb, reverse=True))
    elif len(sb) > len(sa):
        d = len(sb) - len(sa)
        sc = ''.join(sorted(sb)).lstrip('0')
        if len(sc) > len(sa):
            return sc
        num_zeroes = sb.count('0')
        delta = num_zeroes - d
        tmp = ''.join(sorted(sb))[d:]
        print(delta, tmp)
        if delta > 0:
            return nearest(sa, tmp)              
        else:
            return ''.join(sorted(sb)).lstrip('0')
    else:
        cnt = Counter(sb)
        m = min(abs(ord(k) - ord(sa[0])) for k in cnt.keys())
        cnds = [k for k in cnt.keys() if abs(ord(k) -  ord(sa[0])) in (m - 1, m, m + 1)]
        strs = []
        for key in cnds:
            dct = {k: cnt[k] if k != key else cnt[k] - 1 for k in cnt}
            if key > sa[0]:
                strs.append(key + ''.join(sorted([v * k for k, v in dct.items()])))
            elif key < sa[0]:
                strs.append(key + ''.join(sorted([v * k for k, v in dct.items()], reverse=True)))
            else:
                s = ''.join(sorted([v * k for k, v in dct.items()]))
                strs.extend([key + nearest(sa[1:], s)])
            strs.append(key + ''.join(sorted([v * k for k, v in dct.items()], reverse=key < sa[0])))
        return min(strs, key=lambda x: (abs(int(sa) - int(x)), x))
                

print(nearest(n, m))

Embed on website

To embed this program on your website, copy the following code and paste it into your website's HTML: