RosettaCodeData/Task/Entropy/Rust/entropy.rust

21 lines
560 B
Plaintext

fn entropy(s: &[u8]) -> f32 {
let mut entropy: f32 = 0.0;
let mut histogram = [0; 256];
for i in 0..s.len() {
histogram.get_mut(s[i] as usize).map(|v| *v += 1);
}
for i in 0..256 {
if histogram[i] > 0 {
let ratio = (histogram[i] as f32 / s.len() as f32) as f32;
entropy -= (ratio * ratio.log2()) as f32;
}
}
entropy
}
fn main() {
let arg = std::env::args().nth(1).expect("Need a string.");
println!("Entropy of {} is {}.", arg, entropy(&arg.bytes().collect::<Vec<_>>()));
}