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

RNA storage

Changed files
+66 -10
dna2rna
+1
dna2rna/src/main.rs
···
mod dna;
mod parser;
mod pattern;
+
mod rna;
mod template;
fn main() {
+62 -10
dna2rna/src/parser.rs
···
use crate::dna::DnaRef;
use crate::pattern::Pattern;
use crate::pattern::PatternItem;
+
use crate::rna::Rna;
use crate::template::Template;
use crate::template::TemplateItem;
···
}
}
-
pub fn pattern(&mut self) -> Option<Pattern> {
+
pub fn pattern(&mut self, rna: &mut Vec<Rna>) -> Option<Pattern> {
let mut ret = Vec::new();
let mut level = 0;
loop {
···
level -= 1;
ret.push(PatternItem::Close);
} else if self.next_is(&[Base::I, Base::I, Base::I]) {
-
self.index += 10;
-
// TODO: RNA output
+
self.index += 3;
+
let mut new_rna = Vec::new();
+
for i in 0..7 {
+
new_rna.push(self.buf[self.index + i]);
+
}
+
self.index += 7;
+
rna.push(new_rna.try_into().unwrap());
} else {
return None;
}
}
}
-
pub fn template(&mut self) -> Option<Template> {
+
pub fn template(&mut self, rna: &mut Vec<Rna>) -> Option<Template> {
let mut ret = Vec::new();
loop {
if self.next_is(&[Base::C]) {
···
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
+
self.index += 3;
+
let mut new_rna = Vec::new();
+
for i in 0..7 {
+
new_rna.push(self.buf[self.index + i]);
+
}
+
self.index += 7;
+
rna.push(new_rna.try_into().unwrap());
} else {
return None;
}
···
#[test]
fn test_pattern() {
+
let mut rna = Vec::new();
+
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);
+
assert_eq!(
+
parser.pattern(&mut rna),
+
Some(vec![PatternItem::Base(Base::I)])
+
);
+
assert_eq!(parser.index, 4);
let dna = DnaRef::from_string("IIPIPICPIICICIIF");
let mut parser = Parser::new(&dna);
assert_eq!(
-
parser.pattern(),
+
parser.pattern(&mut rna),
Some(vec![
PatternItem::Open,
PatternItem::Skip(2),
···
])
);
assert_eq!(parser.index, 16);
+
+
let dna = DnaRef::from_string("IIIPFCICFPIIC");
+
let mut parser = Parser::new(&dna);
+
assert_eq!(parser.pattern(&mut rna), Some(vec![]));
+
assert_eq!(parser.index, 13);
+
assert_eq!(
+
rna,
+
vec![[
+
Base::P,
+
Base::F,
+
Base::C,
+
Base::I,
+
Base::C,
+
Base::F,
+
Base::P
+
]]
+
);
}
#[test]
fn test_template() {
+
let mut rna = Vec::new();
+
let dna = DnaRef::from_string("CFPICIFCPICPIIPIICPIIC");
let mut parser = Parser::new(&dna);
assert_eq!(
-
parser.template(),
+
parser.template(&mut rna),
Some(vec![
TemplateItem::Base(Base::I),
TemplateItem::Base(Base::C),
···
])
);
assert_eq!(parser.index, 22);
+
+
let dna = DnaRef::from_string("IIIPFCICFPIIC");
+
let mut parser = Parser::new(&dna);
+
assert_eq!(parser.template(&mut rna), Some(vec![]));
+
assert_eq!(parser.index, 13);
+
assert_eq!(
+
rna,
+
vec![[
+
Base::P,
+
Base::F,
+
Base::C,
+
Base::I,
+
Base::C,
+
Base::F,
+
Base::P
+
]]
+
);
}
}
+3
dna2rna/src/rna.rs
···
+
use crate::dna::Base;
+
+
pub type Rna = [Base; 7];