Разница между двумя продуктами, ближайшими к нулю: решение без грубой силы?

Вмузей науки в Норвегии Я наткнулся на следующую математическую игру:

Цель состоит в том, чтобы разместить 10 цифр от 0 до 9 таким образом, чтобы разница между двумя продуктами была близка к нулю. (246 является текущим самым низким счетом).

Вернувшись домой, я написал следующий код перебора:

import time
from itertools import permutations


def form_number(x, y, z, a, b):
    # not explicitly stated, but presume that leading zeroes are not allowed
    if x == 0 or a == 0:
        return 0
    return ((100 * x) + (10 * y) + z) * ((10 * a) + b)

def find_nearest_zero(*args):
    assert len(args) == 10
    return form_number(*args[:5]) - form_number(*args[5:])

if __name__ == '__main__':
    start = time.time()
    count = 0
    for p in permutations(range(10), 10):
        result = find_nearest_zero(*p)
        if result == 0:
            count += 1
            print '{}{}{} * {}{} = {n}'.format(*p[:5], n=form_number(*p[:5]))
            print '{}{}{} * {}{} = {n}'.format(*p[5:], n=form_number(*p[5:]))
            print
    print 'found {} solutions'.format(count)
    print time.time() - start

Если мы не разрешаем начальные нули, то это выводит 128 возможных решений примерно за 12 секунд.

Но я задаюсь вопросом, есть ли алгоритм или лучший способ решить эту проблему не грубой силой?

Ответы на вопрос(2)

Ваш ответ на вопрос