peuler 0.1.0

A Rust crate with solutions to the Project Euler problems
Documentation
use crate::Solution;
use itertools::Itertools;
use pmath::digits::digits;
use pmath::gcd;

problem!(Problem0033, 33, "Digit Cancelling Fractions");

impl Solution for Problem0033 {
    fn solve(&self) -> String {
        let mut result = [1, 1];

        for numerator in 10..100 {
            for denominator in (numerator + 1)..100 {
                let mut digits_numerator_iter = digits(numerator, 10);
                let mut digits_denominator_iter = digits(denominator, 10);
                let digits_numerator = [
                    digits_numerator_iter.next().unwrap(),
                    digits_numerator_iter.next().unwrap(),
                ];
                let digits_denominator = [
                    digits_denominator_iter.next().unwrap(),
                    digits_denominator_iter.next().unwrap(),
                ];

                for (m, n) in (0..2).cartesian_product(0..2) {
                    if (digits_numerator[m] == digits_denominator[n]) && (digits_numerator[m] != 0)
                    {
                        let lowest_terms = lowest_common_terms([
                            digits_numerator[(m + 1) % 2] as u64,
                            digits_denominator[(n + 1) % 2] as u64,
                        ]);
                        if lowest_common_terms([numerator, denominator]) == lowest_terms {
                            result[0] *= lowest_terms[0];
                            result[1] *= lowest_terms[1];
                        }
                        break;
                    }
                }
            }
        }

        result = lowest_common_terms(result);
        result[1].to_string()
    }
}

fn lowest_common_terms(fraction: [u64; 2]) -> [u64; 2] {
    let div = gcd(fraction[0], fraction[1]);
    [fraction[0] / div, fraction[1] / div]
}