Пример #1
0
# 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)
Пример #2
0
def is_pandigital(n):
    return len(used_digits(n)) == num_digits(n)
Пример #3
0
def is_pandigital(n):
    return len(used_digits(n)) == num_digits(n)
Пример #4
0
# 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)
Пример #5
0
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):
Пример #6
0
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)
Пример #7
0
"""

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)