const NUMBER_OF_CLASSES: usize = 3;
fn translated_fibonacci(n: usize) -> usize {
if n == 1 {
return 1;
}
if n == 2 {
return 2;
}
let mut a = 1;
let mut b = 2;
for _ in 3..=n {
let temp = b;
b = a + b;
a = temp;
}
b
}
fn compute_denominator() -> usize {
(1..=NUMBER_OF_CLASSES)
.map(|i| translated_fibonacci(i))
.sum()
}
fn compute_intermediate_value(k: usize, denominator: usize) -> (usize, usize) {
let numerator = translated_fibonacci(k);
(numerator, denominator)
}
pub(super) fn compute_threshold(k: usize) -> f32 {
let denominator = compute_denominator() as f32;
let mut num_sum = 0;
for i in 1..=k {
let (num, _) = compute_intermediate_value(i, denominator as usize);
num_sum += num;
}
num_sum as f32 / denominator
}
pub(super) fn find_threshold_index(value: f32) -> usize {
if value == 0.0 {
return 0;
}
let mut k = 1;
while k <= NUMBER_OF_CLASSES {
let threshold = compute_threshold(k);
if threshold > value {
return k;
}
k += 1;
}
NUMBER_OF_CLASSES }
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_formula_translated_fibonacci() {
let test_values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let expected_values = [1, 2, 3, 5, 8, 13, 21, 34, 55, 89];
for (n, expected) in test_values.iter().zip(expected_values.iter()) {
assert_eq!(translated_fibonacci(*n), *expected);
}
}
#[test]
fn test_formula_compute_denominator() {
let expected: usize = (1..=NUMBER_OF_CLASSES).map(translated_fibonacci).sum();
assert_eq!(compute_denominator(), expected);
}
#[test]
fn test_formula_compute_intermediate_value() {
let denominator = compute_denominator();
let test_values = [1, 2, 3];
for &k in &test_values {
let expected = (translated_fibonacci(k), denominator);
assert_eq!(compute_intermediate_value(k, denominator), expected);
}
}
#[test]
fn test_formula_compute_threshold() {
let test_values = [1, 2, 3];
let denominator = compute_denominator() as f32;
for &k in &test_values {
let num_sum = (1..=k).map(translated_fibonacci).sum::<usize>() as f32;
assert_eq!(compute_threshold(k), num_sum / denominator);
}
}
#[test]
fn test_formula_find_threshold_index() {
let test_values = [0.0, 0.1, 0.3, 0.6, 1.0];
let expected_indices = [0, 1, 2, 3, 3];
for (value, expected) in test_values.iter().zip(expected_indices.iter()) {
assert_eq!(find_threshold_index(*value), *expected);
}
}
}