def main(): """ >>> main() 16695334890 """ base = frozenset(xrange(10)) result = 0 for d4 in [0, 2, 4, 6, 8]: # to be divisible by 2 d6 = 5 # otherwise d_7 and d_8 must be equal to be divisible by 11 for div11 in range(506, 605, 11): # divisible by 11 _, d7, d8 = int_to_list(div11) number = set([d4, d6]) if d7 in number or d8 in number: continue # not pandigital for div17 in range(102, 1003, 17): # divisible by 17 if div17 < d8 * 100 or div17 > (d8 + 1) * 100: continue # d8 doesn't match _, d9, d10 = int_to_list(div17) number = set([d4, d6, d7, d8]) if d9 in number or d10 in number: continue # not pandigital if list_to_int([d7, d8, d9]) % 13 != 0: continue # not divisible by 13 number = set([d4, d6, d7, d8, d9, d10]) for d3 in base - number: number = set([d3, d4, d6, d7, d8, d9, d10]) for d5 in base - number: if list_to_int([d3, d4, d5]) % 3 != 0: continue # not divisible by 3 if list_to_int([d5, d6, d7]) % 7 != 0: continue # not divisible by 7 number = set([d3, d4, d5, d6, d7, d8, d9, d10]) for d2 in base - number: number = set([d2, d3, d4, d5, d6, d7, d8, d9, d10, 0]) for d1 in base - number: result += list_to_int([ d1, d2, d3, d4, d5, d6, d7, d8, d9, d10]) print(result)
def main(): """ >>> main() 932718654 """ max_len_number = 9 max_pandigital_number = 0 # since the multiplier must be at least 2 we can stop when the # multiplicand * 1 and multiplicand * 2 together have more than 9 numbers for multiplicand in range(2, 10000): product_as_list = int_to_list(multiplicand) for multiplier in count(2): product_as_list += int_to_list(multiplicand * multiplier) product = list_to_int(product_as_list) if is_int_pandigital(product) and max_pandigital_number < product: max_pandigital_number = product elif len(product_as_list) > max_len_number: break print(max_pandigital_number)
def main(): """ >>> main() 972 """ max_digit_sum = 0 for a in range(1, 100): for b in range(1, 100): digit_sum = sum(int_to_list(a ** b)) if digit_sum > max_digit_sum: max_digit_sum = digit_sum print(max_digit_sum)
def main(): """ >>> main() 8581146 """ chains_that_arrive_at_89 = 0 for number in combinations_with_replacement(xrange(10), 7): n = list_to_int(number) while n != 1 and n != 89 and n != 0: n = sum([d ** 2 for d in int_to_list(n)]) if n == 89: chains_that_arrive_at_89 += count_permutations_of(number) print(chains_that_arrive_at_89)
def main(): """ >>> main() 40730 """ factorials = [factorial(n) for n in range(10)] summe = -3 # 1 & 2 which are not counted for num_digits in range(8): # upper limit: 7 * 9! < 10**7 for number in combinations_with_replacement(xrange(10), num_digits): factorial_sum = sum((factorials[digit] for digit in number)) if sorted(int_to_list(factorial_sum)) == list(number): summe += factorial_sum print(summe)
def main(): """ >>> main() 55 """ even_digits = frozenset([d for d in range(0, 10, 2)]) primes = Primes(10 ** 6) count_circular_primes = 1 # for the prime 2 for prime in primes: # Exculde all primes that have an even digit in it. if not even_digits.isdisjoint(int_to_list(prime)): continue if all((rotated_prime in primes for rotated_prime in rotate(prime))): count_circular_primes += 1 print(count_circular_primes)
def main(): """ >>> main() 121313 """ amount_of_primes = 8 primes = Primes(10 ** 6) for prime in primes: prime_as_list = int_to_list(prime) list_of_indices = [] # indices of reoccuring digits for i in range(len(prime_as_list)): for j in range(i + 1, len(prime_as_list)): for k in range(j + 1, len(prime_as_list)): if prime_as_list[j] == prime_as_list[k]: list_of_indices.append((i, j, k)) for indices in list_of_indices: prime_family = [] for d in range(10): prime_candidate = prime_as_list[:] for i in indices: prime_candidate[i] = d # ensure that we don't look at n-1-digit numbers if prime_candidate[0] == 0: continue prime_candidate = list_to_int(prime_candidate) if prime_candidate in primes: prime_family.append(prime_candidate) # check if we still can get the neccasry amount of primes if (10 - d) + len(prime_family) < amount_of_primes: break if len(prime_family) == amount_of_primes: print(prime) return
def rotate(number): """ return all rotations of this number""" digits = int_to_list(number) for _ in range(len(digits)): yield list_to_int(digits) digits.append(digits.pop(0))