From 85b94313f6f643725e5e307d92ab9bac7f7f0772 Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Fri, 31 Dec 2021 19:10:25 +0100 Subject: [PATCH] 4kyu: add factorial tail Signed-off-by: Matej Focko --- 4kyu/factorial_tail/solution.rs | 60 +++++++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 61 insertions(+) create mode 100644 4kyu/factorial_tail/solution.rs diff --git a/4kyu/factorial_tail/solution.rs b/4kyu/factorial_tail/solution.rs new file mode 100644 index 0000000..603d8eb --- /dev/null +++ b/4kyu/factorial_tail/solution.rs @@ -0,0 +1,60 @@ +use std::collections::HashMap; +use std::collections::HashSet; + +type Factors = HashMap; + +fn as_primes(mut n: i32) -> Factors { + let mut powers: Factors = HashMap::new(); + + (2..((n as f64).sqrt() as i32) + 1).for_each(|x| { + let mut q = 0; + while n % x == 0 { + n /= x; + q += 1; + } + + if q != 0 { + powers.insert(x, q); + } + }); + + if n > 1 { + powers.insert(n, 1); + } + + powers +} + +fn get_powers(m: i32, primes: HashSet<&i32>) -> Factors { + let mut powers: Factors = HashMap::new(); + + (2..m + 1).for_each(|mut n| { + primes.iter().for_each(|&&x| { + let mut q = 0; + while n % x == 0 { + n /= x; + q += 1; + } + + powers.insert(x, q + powers.get(&x).unwrap_or(&0)); + }); + }); + + powers +} + +fn get_zeroes(base: Factors, powers: Factors) -> i32 { + let mut adjusted: Factors = HashMap::new(); + + for (prime, power) in powers { + adjusted.insert(prime, power / base[&prime]); + } + + *adjusted.values().min().unwrap() +} + +fn zeroes(base: i32, number: i32) -> i32 { + let base_as_primes = as_primes(base); + let powers: Factors = get_powers(number, base_as_primes.keys().collect()); + get_zeroes(base_as_primes, powers) +} diff --git a/README.md b/README.md index 88e53d1..0f52e5e 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ ### Rust - [Sum by Factors](https://www.codewars.com/kata/54d496788776e49e6b00052f) - [solution](4kyu/sum_by_factors) +- [Factorial tail](https://www.codewars.com/kata/55c4eb777e07c13528000021) - [solution](4kyu/factorial_tail) ### C#