ICFP 2007 Contest: https://web.archive.org/web/20090301164728/https://save-endo.cs.uu.nl/
at main 2.0 kB view raw
1use dna_parsing::base::Base; 2use dna_parsing::parser::Parser; 3use std::env; 4use std::fs; 5use std::io; 6use std::io::Write; 7 8fn main() { 9 let args: Vec<String> = env::args().collect(); 10 if args.len() < 3 { 11 println!("Usage: {} <dna file> <offset>", args[0]); 12 return; 13 } 14 15 let Ok(dna) = fs::read_to_string(&args[1]) else { 16 println!("Failed to read dna file at {}", &args[1]); 17 return; 18 }; 19 let Ok(offset): Result<usize, _> = args[2].parse() else { 20 println!("Failed to parse offset {}", &args[2]); 21 return; 22 }; 23 24 let mut index = 0; 25 loop { 26 print!("> "); 27 let _ = io::stdout().flush(); 28 let mut line = String::new(); 29 if !io::stdin().read_line(&mut line).is_ok() { 30 println!("Failed to read response line"); 31 return; 32 } 33 line = line.trim().to_string(); 34 if !line.is_empty() { 35 let Ok(new_index): Result<usize, _> = line.parse() else { 36 println!("Failed to parse {}", line); 37 continue; 38 }; 39 index = new_index; 40 } 41 42 let mut parser = Parser::new( 43 dna[index + offset..] 44 .chars() 45 .filter_map(|c| Base::from_char(c)), 46 ); 47 let mut rna = Vec::new(); 48 let Some(pattern) = parser.pattern(&mut rna) else { 49 println!("Failed to parse pattern"); 50 continue; 51 }; 52 let Some(template) = parser.template(&mut rna) else { 53 println!("Failed to parse template"); 54 continue; 55 }; 56 57 if !rna.is_empty() { 58 println!("RNA output:"); 59 for r in rna.iter() { 60 let rna_str: String = r.iter().map(|b| b.to_char()).collect(); 61 println!(" {}", rna_str); 62 } 63 println!(); 64 } 65 println!("{} ; {} ;", pattern, template); 66 index += parser.index(); 67 println!("Now at: {}", index); 68 } 69}