ICFP 2007 Contest: https://web.archive.org/web/20090301164728/https://save-endo.cs.uu.nl/
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}