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