1// The Computer Language Benchmarks Game 2// https://benchmarksgame-team.pages.debian.net/benchmarksgame/ 3// 4// contributed by the Rust Project Developers 5// contributed by TeXitoi 6// contributed by BurntSushi 7 8use std::io::{self, Read}; 9use std::sync::Arc; 10use std::thread; 11 12macro_rules! regex { 13 ($re:expr) => { 14 ::regex::Regex::new($re).unwrap() 15 }; 16} 17 18fn main() { 19 let mut seq = String::with_capacity(51 * (1 << 20)); 20 io::stdin().read_to_string(&mut seq).unwrap(); 21 let ilen = seq.len(); 22 23 seq = regex!(">[^\n]*\n|\n").replace_all(&seq, "").into_owned(); 24 let clen = seq.len(); 25 let seq_arc = Arc::new(seq.clone()); 26 27 let variants = vec![ 28 regex!("agggtaaa|tttaccct"), 29 regex!("[cgt]gggtaaa|tttaccc[acg]"), 30 regex!("a[act]ggtaaa|tttacc[agt]t"), 31 regex!("ag[act]gtaaa|tttac[agt]ct"), 32 regex!("agg[act]taaa|ttta[agt]cct"), 33 regex!("aggg[acg]aaa|ttt[cgt]ccct"), 34 regex!("agggt[cgt]aa|tt[acg]accct"), 35 regex!("agggta[cgt]a|t[acg]taccct"), 36 regex!("agggtaa[cgt]|[acg]ttaccct"), 37 ]; 38 let mut counts = vec![]; 39 for variant in variants { 40 let seq = seq_arc.clone(); 41 let restr = variant.to_string(); 42 let future = thread::spawn(move || variant.find_iter(&seq).count()); 43 counts.push((restr, future)); 44 } 45 46 let substs = vec![ 47 (regex!("B"), "(c|g|t)"), 48 (regex!("D"), "(a|g|t)"), 49 (regex!("H"), "(a|c|t)"), 50 (regex!("K"), "(g|t)"), 51 (regex!("M"), "(a|c)"), 52 (regex!("N"), "(a|c|g|t)"), 53 (regex!("R"), "(a|g)"), 54 (regex!("S"), "(c|g)"), 55 (regex!("V"), "(a|c|g)"), 56 (regex!("W"), "(a|t)"), 57 (regex!("Y"), "(c|t)"), 58 ]; 59 let mut seq = seq; 60 for (re, replacement) in substs { 61 seq = re.replace_all(&seq, replacement).into_owned(); 62 } 63 64 for (variant, count) in counts { 65 println!("{} {}", variant, count.join().unwrap()); 66 } 67 println!("\n{}\n{}\n{}", ilen, clen, seq.len()); 68} 69