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

Clean up TODOs

Changed files
+121 -56
asm2dna
dna2rna
src
rna2bmp
+66 -5
asm2dna/src/assembler.rs
···
let mut ret = 0;
let mut iter = s.chars();
if is_hex {
-
// TODO: advance_by?
iter.nth(1);
}
···
self.expect('{').ok_or("Skip followed by non-{")?;
let n = self.read_to("}").ok_or("Skip failed to terminate")?;
let n = Self::parse_int(&n).ok_or("Invalid int inside skip")?;
-
self.emit("IP");
+
self.emit("IP");
self.emit(&Self::encode_int(n, IntPadding::NoPadding));
self.expect('}').ok_or("Skip failed to terminate")?;
}
···
let n = self.read_to("\",").ok_or("Reference failed terminate")?;
let n = Self::parse_int(&n).ok_or("Reference group index invalid")?;
let l = match self.iter.next() {
-
Some('"') => "0",
-
Some(',') => &self.read_to("\",").ok_or("Reference failed to terminate")?,
+
Some('"') => String::from("0"),
+
Some(',') => {
+
let l = self.read_to("\"").ok_or("Reference failed to terminate")?;
+
self.expect('"');
+
l
+
}
_ => return Err("Reference failed to terminate"),
};
let l = Self::parse_int(&l).ok_or("Reference level invalid")?;
···
let n = Self::parse_int(&n).ok_or("Length group index invalid")?;
self.emit("IIP");
self.emit(&Self::encode_int(n, IntPadding::NoPadding));
+
self.expect('|').ok_or("Length failed to terminate")?;
}
Some('n') => {
self.expect('{');
···
}
}
-
// TODO: Tests
+
#[cfg(test)]
+
mod tests {
+
use super::*;
+
+
#[test]
+
fn test_assemble_bases() {
+
let asm = assemble(&"ICFP").unwrap();
+
assert_eq!(b"CFPIC", &asm[..]);
+
}
+
+
#[test]
+
fn test_assemble_skip() {
+
let asm = assemble(&"!{1} !{0x10}").unwrap();
+
assert_eq!(b"IPCPIPIIIICP", &asm[..]);
+
}
+
+
#[test]
+
fn test_assemble_search() {
+
let asm = assemble(&"?{ICFP}").unwrap();
+
assert_eq!(b"IFFCFPIC", &asm[..]);
+
}
+
+
#[test]
+
fn test_assemble_groups() {
+
let asm = assemble(&"()()").unwrap();
+
assert_eq!(b"IIPIICIIPIIC", &asm[..]);
+
}
+
+
#[test]
+
fn test_assemble_pattern_template() {
+
let asm = assemble(&"!{2} ; II ;").unwrap();
+
assert_eq!(b"IPICPIICCCIIC", &asm[..]);
+
}
+
+
#[test]
+
fn test_assemble_pattern_quote() {
+
let asm = assemble(&"\"2\"").unwrap();
+
assert_eq!(b"IPPICP", &asm[..]);
+
+
let asm = assemble(&"\"2,3\"").unwrap();
+
assert_eq!(b"IPCCPICP", &asm[..]);
+
}
+
+
#[test]
+
fn test_assemble_pattern_length() {
+
let asm = assemble(&"|3|").unwrap();
+
assert_eq!(b"IIPCCP", &asm[..]);
+
}
+
+
#[test]
+
fn test_assemble_pattern_constant() {
+
let asm = assemble(&"n{4,5}").unwrap();
+
assert_eq!(b"CCFCIC", &asm[..]);
+
+
let asm = assemble(&"n{0x123,24}").unwrap();
+
assert_eq!(b"FFCCCFCCFCCCCCCCCCCCCCCIC", &asm[..]);
+
}
+
}
+9 -7
asm2dna/src/main.rs
···
use std::env;
use std::fs;
-
use std::io;
-
fn main() -> io::Result<()> {
+
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() < 3 {
println!("Usage: {} <asm file> <dna file>", args[0]);
-
return Ok(());
+
return;
}
-
// TODO: Better error messages
-
let asm = fs::read_to_string(&args[1])?;
+
let Ok(asm) = fs::read_to_string(&args[1]) else {
+
println!("Failed to open asm file at {}", &args[1]);
+
return;
+
};
match assembler::assemble(&asm) {
-
Ok(dna) => fs::write(&args[2], dna)?,
+
Ok(dna) => {
+
let _ = fs::write(&args[2], dna);
+
}
Err(err) => println!("{}", err),
}
-
return Ok(());
}
+18 -10
dna2rna/src/main.rs
···
use std::env;
use std::fs;
use std::fs::File;
-
use std::io;
use std::io::Write;
-
fn main() -> io::Result<()> {
+
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() < 4 {
println!("Usage: {} <prefix file> <dna file> <rna file>", args[0]);
-
return Ok(());
+
return;
}
-
// TODO: Better error messages
-
let prefix = fs::read_to_string(&args[1])?;
-
let dna = fs::read_to_string(&args[2])?;
+
let Ok(prefix) = fs::read_to_string(&args[1]) else {
+
println!("Failed to read prefix file at {}", &args[1]);
+
return;
+
};
+
let Ok(dna) = fs::read_to_string(&args[2]) else {
+
println!("Failed to read dna file at {}", &args[2]);
+
return;
+
};
let mut dna = dna::DnaRef::from_string(&prefix) + dna::DnaRef::from_string(&dna);
-
let mut rna_file = File::create(&args[3])?;
+
let Ok(mut rna_file) = File::create(&args[3]) else {
+
println!("Failed to create rna output file at {}", &args[3]);
+
return;
+
};
let mut rna = Vec::new();
loop {
if let Some(new_dna) = match_replace::match_replace(dna, &mut rna) {
···
for r in rna.iter() {
let rna_str: String = r.iter().map(|b| b.to_char()).collect();
-
rna_file.write(rna_str.as_bytes())?;
-
rna_file.write(b"\n")?;
+
// Just tolerate a write error.
+
let _ = rna_file.write(rna_str.as_bytes());
+
let _ = rna_file.write(b"\n");
}
rna.clear();
}
-
return Ok(());
+
return;
}
+28 -34
rna2bmp/src/rna_processor.rs
···
} else if r == "PCCIFFP" {
self.mark = self.position;
} else if r == "PFFICCP" {
-
// TODO: Can I rework this to reduce casts or locals?
let x0 = self.position.0 as isize;
let y0 = self.position.1 as isize;
let x1 = self.mark.0 as isize;
···
self.bitmaps.push(Bitmap::new());
}
} else if r == "PFFPCCP" {
-
// TODO: Better structure
-
if let Some(bmp0) = self.bitmaps.pop() {
-
if let Some(mut bmp1) = self.bitmaps.pop() {
-
for x in 0..SIZE {
-
for y in 0..SIZE {
-
let (r0, g0, b0, a0) = *bmp0.pixel((x, y));
-
let (r1, g1, b1, a1) = *bmp1.pixel((x, y));
-
let r = r0 + ((r1 as usize) * (255 - a0 as usize) / 255) as u8;
-
let g = g0 + ((g1 as usize) * (255 - a0 as usize) / 255) as u8;
-
let b = b0 + ((b1 as usize) * (255 - a0 as usize) / 255) as u8;
-
let a = a0 + ((a1 as usize) * (255 - a0 as usize) / 255) as u8;
-
*bmp1.pixel_mut((x, y)) = (r, g, b, a);
-
}
+
if self.bitmaps.len() >= 2 {
+
let bmp0 = self.bitmaps.pop().unwrap();
+
let mut bmp1 = self.bitmaps.pop().unwrap();
+
for x in 0..SIZE {
+
for y in 0..SIZE {
+
let (r0, g0, b0, a0) = *bmp0.pixel((x, y));
+
let (r1, g1, b1, a1) = *bmp1.pixel((x, y));
+
let r = r0 + ((r1 as usize) * (255 - a0 as usize) / 255) as u8;
+
let g = g0 + ((g1 as usize) * (255 - a0 as usize) / 255) as u8;
+
let b = b0 + ((b1 as usize) * (255 - a0 as usize) / 255) as u8;
+
let a = a0 + ((a1 as usize) * (255 - a0 as usize) / 255) as u8;
+
*bmp1.pixel_mut((x, y)) = (r, g, b, a);
}
-
self.bitmaps.push(bmp1);
-
} else {
-
self.bitmaps.push(bmp0);
-
}
+
}
+
self.bitmaps.push(bmp1);
}
} else if r == "PFFICCF" {
-
if let Some(bmp0) = self.bitmaps.pop() {
-
if let Some(mut bmp1) = self.bitmaps.pop() {
-
for x in 0..SIZE {
-
for y in 0..SIZE {
-
let (_, _, _, a0) = *bmp0.pixel((x, y));
-
let (r1, g1, b1, a1) = *bmp1.pixel((x, y));
-
let r = ((r1 as usize) * (a0 as usize) / 255) as u8;
-
let g = ((g1 as usize) * (a0 as usize) / 255) as u8;
-
let b = ((b1 as usize) * (a0 as usize) / 255) as u8;
-
let a = ((a1 as usize) * (a0 as usize) / 255) as u8;
-
*bmp1.pixel_mut((x, y)) = (r, g, b, a);
-
}
+
if self.bitmaps.len() >= 2 {
+
let bmp0 = self.bitmaps.pop().unwrap();
+
let mut bmp1 = self.bitmaps.pop().unwrap();
+
for x in 0..SIZE {
+
for y in 0..SIZE {
+
let (_, _, _, a0) = *bmp0.pixel((x, y));
+
let (r1, g1, b1, a1) = *bmp1.pixel((x, y));
+
let r = ((r1 as usize) * (a0 as usize) / 255) as u8;
+
let g = ((g1 as usize) * (a0 as usize) / 255) as u8;
+
let b = ((b1 as usize) * (a0 as usize) / 255) as u8;
+
let a = ((a1 as usize) * (a0 as usize) / 255) as u8;
+
*bmp1.pixel_mut((x, y)) = (r, g, b, a);
}
-
self.bitmaps.push(bmp1);
-
} else {
-
self.bitmaps.push(bmp0);
-
}
+
}
+
self.bitmaps.push(bmp1);
}
}
}