ICFP 2007 Contest: https://web.archive.org/web/20090301164728/https://save-endo.cs.uu.nl/

Setup tup

Changed files
+33 -21
dna2rna
+4 -1
.gitignore
···
dna2rna/target/
rna2bmp/target/
rna/
-
bmp/
+
bmp/
+
.tup/
+
bin/
+
png/
+10
Tupfile
···
+
RUSTC_FLAGS= --edition=2024 --crate-type bin --emit=link -C opt-level=3 -C embed-bitcode=no --check-cfg 'cfg (docsrs,test)' --check-cfg 'cfg(feature, values())' --out-dir bin -C strip=debuginfo -L dependency=bin
+
+
: dna2rna/src/*.rs |> rustc --crate-name dna2rna dna2rna/src/main.rs $(RUSTC_FLAGS) |> bin/dna2rna
+
: rna2bmp/src/*.rs |> rustc --crate-name rna2bmp rna2bmp/src/main.rs $(RUSTC_FLAGS) |> bin/rna2bmp
+
+
: foreach prefixes/*.dna | bin/dna2rna |> ./bin/dna2rna %f task/endo.dna rna/%B.rna |> rna/%B.rna
+
+
: foreach rna/*.rna | bin/rna2bmp |> ./bin/rna2bmp %f bmp/%B.bmp |> bmp/%B.bmp
+
+
: foreach bmp/*.bmp |> convert %f png/%B.png |> png/%B.png
+16 -17
dna2rna/src/main.rs
···
use std::env;
use std::fs;
+
use std::fs::File;
+
use std::io;
+
use std::io::Write;
-
fn main() {
+
fn main() -> io::Result<()> {
let args: Vec<String> = env::args().collect();
-
if args.len() < 3 {
-
println!("Usage: {} <prefix file> <dna file>", args[0]);
-
return;
+
if args.len() < 4 {
+
println!("Usage: {} <prefix file> <dna file> <rna file>", args[0]);
+
return Ok(());
}
-
let Ok(prefix) = fs::read_to_string(&args[1]) else {
-
println!("Could not open {}", args[1]);
-
return;
-
};
-
-
let Ok(dna) = fs::read_to_string(&args[2]) else {
-
println!("Could not open {}", args[2]);
-
return;
-
};
+
// TODO: Better error messages
+
let prefix = fs::read_to_string(&args[1])?;
+
let dna = fs::read_to_string(&args[2])?;
let mut dna = dna::DnaRef::from_string(&prefix) + dna::DnaRef::from_string(&dna);
+
let mut rna_file = File::create(&args[3])?;
let mut rna = Vec::new();
loop {
if let Some(new_dna) = match_replace::match_replace(dna, &mut rna) {
···
}
for r in rna.iter() {
-
for b in r {
-
print!("{}", b.to_char());
-
}
-
println!();
+
let rna_str: String = r.iter().map(|b| b.to_char()).collect();
+
rna_file.write(rna_str.as_bytes())?;
+
rna_file.write(b"\n")?;
}
rna.clear();
}
+
+
return Ok(());
}
+3 -3
dna2rna/src/parser.rs
···
pub fn next_is(&mut self, next: &[Base]) -> bool {
self.peek_to(next.len());
-
if self.peeked.len() < next.len() {
-
return false;
-
}
+
if self.peeked.len() < next.len() {
+
return false;
+
}
return &self.peeked[..next.len()] == next;
}