ICFP 2007 Contest: https://web.archive.org/web/20090301164728/https://save-endo.cs.uu.nl/
1mod dna;
2mod match_replace;
3mod parser;
4mod pattern;
5mod rna;
6mod template;
7
8use std::env;
9use std::fs;
10use std::fs::File;
11use std::io::Write;
12
13fn main() {
14 let args: Vec<String> = env::args().collect();
15 if args.len() < 4 {
16 println!("Usage: {} <prefix file> <dna file> <rna file>", args[0]);
17 return;
18 }
19
20 let Ok(prefix) = fs::read_to_string(&args[1]) else {
21 println!("Failed to read prefix file at {}", &args[1]);
22 return;
23 };
24 let Ok(dna) = fs::read_to_string(&args[2]) else {
25 println!("Failed to read dna file at {}", &args[2]);
26 return;
27 };
28
29 let mut dna = dna::DnaRef::from_string(&prefix) + dna::DnaRef::from_string(&dna);
30 let Ok(mut rna_file) = File::create(&args[3]) else {
31 println!("Failed to create rna output file at {}", &args[3]);
32 return;
33 };
34 let mut rna = Vec::new();
35 loop {
36 if let Some(new_dna) = match_replace::match_replace(dna, &mut rna) {
37 dna = new_dna;
38 } else {
39 break;
40 }
41
42 for r in rna.iter() {
43 let rna_str: String = r.iter().map(|b| b.to_char()).collect();
44 // Just tolerate a write error.
45 let _ = rna_file.write(rna_str.as_bytes());
46 let _ = rna_file.write(b"\n");
47 }
48
49 rna.clear();
50 }
51
52 return;
53}