def problem35(): """ Circular primes How many circular primes are there below one million? """ return_value = 0 for prime in mathhelper.prime_list(999999): prime_digits = list(str(prime)) rotate_list = collections.deque(prime_digits) rotate_list_length = len(rotate_list) if rotate_list_length == 1: return_value += 1 continue if len({"0", "2", "4", "5", "6", "8"}.intersection(prime_digits)) > 0: continue for rotate in range(1, rotate_list_length): rotate_list.rotate(1) if not mathhelper.is_prime(mathhelper.create_number(rotate_list)): break if rotate + 1 == rotate_list_length: return_value += 1 return return_value
def problem43(): """ Sub-string divisibility Find the sum of all 0 to 9 pandigital numbers with this property. """ dividers = [1, 2, 3, 5, 7, 11, 13, 17] return_value = 0 for permutation in itertools.permutations([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 10): if permutation[0] == 0: continue divisibility = True for start in range(1, 8): three_digits = permutation[start:start + 3] number = mathhelper.create_number(three_digits) if number % dividers[start] != 0: divisibility = False break if divisibility: return_value += mathhelper.create_number(permutation) return return_value
def test_create_number(self): self.assertEqual(mathhelper.create_number(list("123")), 123) self.assertEqual(mathhelper.create_number(list("0123")), 123) self.assertEqual(mathhelper.create_number(list("9876")), 9876) self.assertEqual(mathhelper.create_number([4, 5, 6, 7, 8, 9]), 456789)