1use std::collections::HashMap;
2use std::ops::Range;
3
4pub fn calculate_score(pattern_length: usize, e: i32, x: i32, loc: i32, distance: i32) -> f64 {
5 let accuracy = (e as f64) / (pattern_length as f64);
6 let proximity = (x - loc).abs();
7 if distance == 0 {
8 return if proximity != 0 { 1. } else { accuracy };
9 }
10 accuracy + (proximity as f64) / (distance as f64)
11}
12
13pub fn calculate_pattern_alphabet(pattern: &[u8]) -> HashMap<u8, u64> {
17 let len = pattern.len();
18 let mut mask = HashMap::new();
19 for (i, &c) in pattern.iter().enumerate() {
20 mask.insert(c, mask.get(&c).unwrap_or(&0) | (1 << (len - i - 1)));
21 }
22 mask
23}
24
25pub fn find_ranges(mask: &[u8]) -> Result<Vec<Range<usize>>, String> {
29 if mask.is_empty() {
30 return Err(String::from("Input array is empty"));
31 }
32 let mut ranges = vec![];
33 let mut start: i32 = -1;
34 for (n, bit) in mask.iter().enumerate() {
35 if start == -1 && *bit >= 1 {
36 start = n as i32;
37 } else if start != -1 && *bit == 0 {
38 ranges.push(start as usize..n);
39 start = -1;
40 }
41 }
42
43 if *mask.last().unwrap() == 1 {
44 ranges.push(start as usize..mask.len())
45 }
46 Ok(ranges)
47}