use crate::statistical_tests::utils::convert_string;
use std::collections::HashMap;
pub fn get_rod(text: &str) -> f64 {
let data = convert_string(text);
if data.len() < 2 {
return 0.0;
}
let mut first_occurrences = HashMap::new();
for (i, &c) in data.iter().enumerate() {
first_occurrences.entry(c).or_insert(i);
}
let mut total_distance = 0.0;
let mut count = 0;
for (i, &c) in data.iter().enumerate() {
if let Some(&first_pos) = first_occurrences.get(&c) {
if i > first_pos {
total_distance += (i - first_pos) as f64;
count += 1;
}
}
}
if count == 0 {
return 0.0;
}
total_distance / count as f64
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_rod_with_close_repeats() {
let text = "AABBCCDD";
let rod = get_rod(text);
assert_eq!(rod, 1.0); }
#[test]
fn test_rod_with_distant_repeats() {
let text = "ABCDABCD";
let rod = get_rod(text);
assert_eq!(rod, 4.0); }
#[test]
fn test_rod_no_repeats() {
let text = "ABCDEFG";
let rod = get_rod(text);
assert_eq!(rod, 0.0); }
}