1
0
Fork 0
mirror of https://gitlab.com/mfocko/CodeWars.git synced 2024-11-21 16:13:47 +01:00

4kyu: add factorial tail

Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
Matej Focko 2021-12-31 19:10:25 +01:00
parent 1f4adef5e6
commit 85b94313f6
No known key found for this signature in database
GPG key ID: 332171FADF1DB90B
2 changed files with 61 additions and 0 deletions

View file

@ -0,0 +1,60 @@
use std::collections::HashMap;
use std::collections::HashSet;
type Factors = HashMap<i32, i32>;
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)
}

View file

@ -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#