// Search parameters pub const CORPUS_FILE_NAME: &str = "corpus.txt"; pub const STARTING_LAYOUT_STRING: &str = " Q W E R T Y U I O P A S D F G H J K L ' Z X C V B N M , . / "; pub const NUM_CONTESTANTS: usize = 128; pub const NUM_PERSIST: usize = 8; pub const DESIRED_INDEX_USAGE_PERCENT: f32 = 0.15; pub const fn index_usage_fitness(index_threshold: u32, index_count: u32) -> u32 { (index_threshold as i64 - index_count as i64).abs() as u32 / 64 } // Do not change, code makes assumptions about these pub const NUM_KEYS: usize = 30; pub const ROW_LENGTH: usize = 10; pub const KEY_CHARS: [char; NUM_KEYS] = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '/', '.', ',', '\'', ]; pub const KEY_TO_FINGER: [usize; NUM_KEYS] = [ 0, 1, 2, 3, 3, 4, 4, 5, 6, 7, 0, 1, 2, 3, 3, 4, 4, 5, 6, 7, 0, 1, 2, 3, 3, 4, 4, 5, 6, 7, ]; pub fn canonicalise(inp: char) -> Option { if inp.is_ascii_alphabetic() { return Some(inp.to_ascii_uppercase()); } else { match inp { '.' => Some('.'), '>' => Some('.'), ',' => Some(','), '<' => Some(','), '/' => Some('/'), '?' => Some('/'), '\'' => Some('\''), '"' => Some('\''), _ => None, } } }