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

Template parsing

Changed files
+75 -6
dna2rna
+2 -3
dna2rna/src/main.rs
···
mod dna;
mod parser;
mod pattern;
-
-
use crate::dna::*;
+
mod template;
fn main() {
-
let dna: DnaRef = DnaRef::from_string("ICFP");
+
let dna = dna::DnaRef::from_string("ICFP");
println!("Back to string: {}", dna.to_string());
}
+62 -2
dna2rna/src/parser.rs
···
-
use crate::Base;
-
use crate::DnaRef;
+
use crate::dna::Base;
+
use crate::dna::DnaRef;
use crate::pattern::Pattern;
use crate::pattern::PatternItem;
+
use crate::template::Template;
+
use crate::template::TemplateItem;
struct Parser<'a> {
buf: &'a DnaRef,
···
}
}
}
+
+
pub fn template(&mut self) -> Option<Template> {
+
let mut ret = Vec::new();
+
loop {
+
if self.next_is(&[Base::C]) {
+
self.index += 1;
+
ret.push(TemplateItem::Base(Base::I));
+
} else if self.next_is(&[Base::F]) {
+
self.index += 1;
+
ret.push(TemplateItem::Base(Base::C));
+
} else if self.next_is(&[Base::P]) {
+
self.index += 1;
+
ret.push(TemplateItem::Base(Base::F));
+
} else if self.next_is(&[Base::I, Base::C]) {
+
self.index += 2;
+
ret.push(TemplateItem::Base(Base::P));
+
} else if self.next_is(&[Base::I, Base::P]) || self.next_is(&[Base::I, Base::F]) {
+
self.index += 2;
+
let l = self.nat()?;
+
let n = self.nat()?;
+
ret.push(TemplateItem::Ref(n, l));
+
} else if self.next_is(&[Base::I, Base::I, Base::C])
+
|| self.next_is(&[Base::I, Base::I, Base::F])
+
{
+
self.index += 3;
+
return Some(ret);
+
} else if self.next_is(&[Base::I, Base::I, Base::P]) {
+
self.index += 3;
+
let n = self.nat()?;
+
ret.push(TemplateItem::Len(n));
+
} else if self.next_is(&[Base::I, Base::I, Base::I]) {
+
self.index += 10;
+
// TODO: RNA output
+
} else {
+
return None;
+
}
+
}
+
}
}
#[cfg(test)]
···
let dna = DnaRef::from_string("CIIC");
let mut parser = Parser::new(&dna);
assert_eq!(parser.pattern(), Some(vec![PatternItem::Base(Base::I)]));
+
assert_eq!(parser.ijndex, 4);
let dna = DnaRef::from_string("IIPIPICPIICICIIF");
let mut parser = Parser::new(&dna);
···
PatternItem::Base(Base::P)
])
);
+
assert_eq!(parser.index, 16);
+
}
+
+
#[test]
+
fn test_template() {
+
let dna = DnaRef::from_string("CFPICIFCPICPIIPIICPIIC");
+
let mut parser = Parser::new(&dna);
+
assert_eq!(
+
parser.template(),
+
Some(vec![
+
TemplateItem::Base(Base::I),
+
TemplateItem::Base(Base::C),
+
TemplateItem::Base(Base::F),
+
TemplateItem::Base(Base::P),
+
TemplateItem::Ref(2, 1),
+
TemplateItem::Len(4)
+
])
+
);
+
assert_eq!(parser.index, 22);
}
}
+1 -1
dna2rna/src/pattern.rs
···
-
use crate::Base;
+
use crate::dna::Base;
#[derive(Debug, PartialEq)]
pub enum PatternItem {
+10
dna2rna/src/template.rs
···
+
use crate::dna::Base;
+
+
#[derive(Debug, PartialEq)]
+
pub enum TemplateItem {
+
Base(Base),
+
Ref(usize, usize),
+
Len(usize),
+
}
+
+
pub type Template = Vec<TemplateItem>;