Differenz zwischen zwei Produkten nahe Null: Nicht-Brute-Force-Lösung?

In einemscience museum in Norway Ich bin auf folgendes mathematisches Spiel gestoßen:

Das Ziel ist es, die 10 Ziffern von 0 bis 9 so zu platzieren, dass die Differenz zwischen den beiden Produkten der Null am nächsten kommt. (Die 246 ist die aktuell niedrigste Punktzahl).

Zurück zu Hause schrieb ich den folgenden Brute-Force-Code:

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

Wenn wir keine führenden Nullen zulassen, werden 128 mögliche Lösungen in ca. 12 Sekunden ausgegeben.

Aber ich frage mich, gibt es einen Algorithmus oder eine bessere Möglichkeit, dies auf eine Art und Weise zu lösen, die nicht brachial ist?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage