Вот мое решение. Мне нравятся все вещи снизу вверх ;-). На моей машине он работает примерно в 580 раз быстрее (3,1 мсек против 1,8 с), чем отметки:
def generate(digits, remaining=set('123456789').difference):
return (n + m
for n in generate(digits - 1)
for m in remaining(n)
if int(n + m) % digits == 0) if digits > 0 else ['']
for each in generate(9):
print(int(each))
РЕДАКТИРОВАТЬ: Кроме того, это работает, и в два раза быстрее (1,6 мсек):
from functools import reduce
def generate():
def digits(x):
while x:
x, y = divmod(x, 10)
yield y
remaining = set(range(1, 10)).difference
def gen(numbers, decimal_place):
for n in numbers:
for m in remaining(digits(n)):
number = 10 * n + m
if number % decimal_place == 0:
yield number
return reduce(gen, range(2, 10), remaining())
for each in generate():
print(int(each))