def cancelling_fractions(): res = [] for n in range(10, 99): for d in range(n + 1, 100): if d % 10 == 0 or not _has_common_digit(n, d): continue n_digits = number_as_digits(n) d_digits = number_as_digits(d) common_digits = set(n_digits) & set(d_digits) for common_digit in common_digits: n_digits_except_common = list_except(n_digits, n_digits.index(common_digit)) d_digits_except_common = list_except(d_digits, d_digits.index(common_digit)) reduced_val = float(next(iter(n_digits_except_common))) / float(next(iter(d_digits_except_common))) val = float(n) / float(d) if fabs(reduced_val - val) < 0.00000001: res += [(n, d)] return res
def test_digit_powers(self): for num in digit_powers(): digits = number_as_digits(num) root = int(round(pow(num, 1.0 / len(digits)))) self.assertEqual(num, root ** len(digits))
def digit_factorial(): res = [] for i in range(3, 100000): if i == sum(map(factorial, number_as_digits(i))): res += [i] return res
def _has_common_digit(number_a, number_b): number_a_digits = set(number_as_digits(number_a)) number_b_digits = set(number_as_digits(number_b)) return len(number_a_digits & number_b_digits) > 0
def powers(a, b): res = 1 for i in range(1, a + 1): for j in range(1, b + 1): res = max(res, sum(number_as_digits(i ** j))) return res