problem 33 https projecteuler netproblem33 the fraction 4998 is a curious fraction as an inexperienced mathematician in attempting to simplify it may incorrectly believe that 4998 48 which is correct is obtained by cancelling the 9s we shall consider fractions like 3050 35 to be trivial examples there are exactly four nontrivial examples of this type of fraction less than one in value and containing two digits in the numerator and denominator if the product of these four fractions is given in its lowest common terms find the value of the denominator fractionlist2 1664 1995 2665 4998 fractionlist3 1664 1995 2665 4998 fractionlist4 1664 1995 2665 4998 fractionlist0 fractionlist5 1664 1995 2665 4998 return the solution to the problem fraction_list 2 16 64 19 95 26 65 49 98 fraction_list 3 16 64 19 95 26 65 49 98 fraction_list 4 16 64 19 95 26 65 49 98 fraction_list 0 fraction_list 5 16 64 19 95 26 65 49 98 return the solution to the problem
from __future__ import annotations

from fractions import Fraction


def is_digit_cancelling(num: int, den: int) -> bool:
    return (
        num != den and num % 10 == den // 10 and (num // 10) / (den % 10) == num / den
    )


def fraction_list(digit_len: int) -> list[str]:
    
    solutions = []
    den = 11
    last_digit = int("1" + "0" * digit_len)
    for num in range(den, last_digit):
        while den <= 99:
            if (num != den) and (num % 10 == den // 10) and (den % 10 != 0):
                if is_digit_cancelling(num, den):
                    solutions.append(f"{num}/{den}")
            den += 1
        num += 1
        den = 10
    return solutions


def solution(n: int = 2) -> int:
    
    result = 1.0
    for fraction in fraction_list(n):
        frac = Fraction(fraction)
        result *= frac.denominator / frac.numerator
    return int(result)


if __name__ == "__main__":
    print(solution())