# Author: Deddryk """ Solution to problem 38 """ from utils.misc import used_digits, num_digits def is_pandigital(n): return len(used_digits(n)) == num_digits(n) concatenated_pandigitals = set() for i in xrange(10, 10000): multiplier = 1 concatenated_product = 0 while num_digits(concatenated_product) < 9: next_part = i * multiplier multiplier += 1 concatenated_product = concatenated_product * 10**num_digits( next_part) + next_part if not is_pandigital(concatenated_product): break if 0 in used_digits(concatenated_product): break else: if num_digits(concatenated_product) == 9: concatenated_pandigitals.add(concatenated_product) print max(concatenated_pandigitals)
def is_pandigital(n): return len(used_digits(n)) == num_digits(n)
# Author: Deddryk """ Solution to problem 38 """ from utils.misc import used_digits, num_digits def is_pandigital(n): return len(used_digits(n)) == num_digits(n) concatenated_pandigitals = set() for i in xrange(10, 10000): multiplier = 1 concatenated_product = 0 while num_digits(concatenated_product) < 9: next_part = i * multiplier multiplier += 1 concatenated_product = concatenated_product * 10 ** num_digits(next_part) + next_part if not is_pandigital(concatenated_product): break if 0 in used_digits(concatenated_product): break else: if num_digits(concatenated_product) == 9: concatenated_pandigitals.add(concatenated_product) print max(concatenated_pandigitals)
Solution to problem 32. This solution is ugly but it works quickly. Using sets I limit the search space to only those numbers that do not have similar digits, and only 3 or 4 digits. """ from math import log10, floor from utils.misc import used_digits digits = set([1, 2, 3, 4, 5, 6, 7, 8, 9]) m1 = set() m2 = set() products = set() for i in digits: for j in digits - used_digits(i): for k in digits - used_digits(i) - used_digits(j): m1.add(100*i + 10*j + k) for l in digits - used_digits(i) - used_digits(j) - used_digits(k): m2.add(1000*i + 100*j + 10*k + l) for i in m1: m3 = set() for j in digits - used_digits(i): for k in digits - used_digits(i) - used_digits(j): m3.add(10 * j + k) for j in m3: if floor(log10(i*j)) == 3 and len(digits - used_digits(i) - used_digits(j) - used_digits(i*j)) == 0: products.add(i*j) for i in m2: for j in digits - used_digits(i):
Solution to problem 32. This solution is ugly but it works quickly. Using sets I limit the search space to only those numbers that do not have similar digits, and only 3 or 4 digits. """ from math import log10, floor from utils.misc import used_digits digits = set([1, 2, 3, 4, 5, 6, 7, 8, 9]) m1 = set() m2 = set() products = set() for i in digits: for j in digits - used_digits(i): for k in digits - used_digits(i) - used_digits(j): m1.add(100 * i + 10 * j + k) for l in digits - used_digits(i) - used_digits(j) - used_digits(k): m2.add(1000 * i + 100 * j + 10 * k + l) for i in m1: m3 = set() for j in digits - used_digits(i): for k in digits - used_digits(i) - used_digits(j): m3.add(10 * j + k) for j in m3: if floor(log10( i * j)) == 3 and len(digits - used_digits(i) - used_digits(j) - used_digits(i * j)) == 0: products.add(i * j)
""" from utils.misc import used_digits, gcd from utils.primes import factor num = 1 den = 1 def check_eq(a, b, c, d, num, den): if a % 10 == 0 and b % 10 == 0: return num, den if a / gcd(a, b) == c / gcd(c, d) and b / gcd(a, b) == d / gcd(c, d): num *= a den *= b return num, den for i in xrange(10, 100): for j in xrange(i + 1, 100): if len(used_digits(i) & used_digits(j)) > 0: if i / 10 == j / 10: num, den = check_eq(i, j, i % 10, j % 10, num, den) elif i / 10 == j % 10: num, den = check_eq(i, j, i % 10, j / 10, num, den) elif i % 10 == j / 10: num, den = check_eq(i, j, i / 10, j % 10, num, den) else: num, den = check_eq(i, j, i / 10, j / 10, num, den) print den / gcd(num, den)