Решение на Сметки с ДНК от Даниел Янев
Резултати
- 20 точки от тестове
- 0 бонус точки
- 20 точки общо
- 12 успешни тест(а)
- 0 неуспешни тест(а)
Код
pub struct NucleotideCounter {
pub a: usize,
pub c: usize,
pub g: usize,
pub t: usize,
}
impl NucleotideCounter {
fn empty_counter () -> NucleotideCounter {
NucleotideCounter {
a: 0,
c: 0,
g: 0,
t: 0
}
}
}
pub fn counts(dna: &[char]) -> NucleotideCounter {
let mut counter = NucleotideCounter::empty_counter();
for nucleotide in dna {
match nucleotide {
'A' => counter.a = counter.a + 1,
'C' => counter.c = counter.c + 1,
'G' => counter.g = counter.g + 1,
'T' => counter.t = counter.t + 1,
_ => panic!("Грешка, грешка, обърках вратата"),
}
}
counter
}
pub fn dna_complement(dna: &[char]) -> Vec<char> {
let mut complements: Vec<char> = Vec::new();
for nucleotide in dna {
match nucleotide {
'A' => complements.push('T'),
'C' => complements.push('G'),
'G' => complements.push('C'),
'T' => complements.push('A'),
_ => panic!("Грешка, грешка, обърках вратата"),
}
}
complements
}
pub fn reverse_rna_complement(dna: &[char]) -> Vec<char> {
let mut complements: Vec<char> = Vec::new();
for nucleotide in dna.iter().rev() {
match nucleotide {
'A' => complements.push('U'),
'C' => complements.push('G'),
'G' => complements.push('C'),
'T' => complements.push('A'),
_ => panic!("Грешка, грешка, обърках вратата"),
}
}
complements
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20220112-2706256-e7m43a/solution) Finished test [unoptimized + debuginfo] target(s) in 5.59s Running tests/solution_test.rs (target/debug/deps/solution_test-4c880d3f0adaac34) running 12 tests test solution_test::test_counts_basic ... ok test solution_test::test_counts_big ... ok test solution_test::test_counts_panic1 - should panic ... ok test solution_test::test_counts_panic2 - should panic ... ok test solution_test::test_counts_zero ... ok test solution_test::test_dna_complement_big ... ok test solution_test::test_dna_complement_empty ... ok test solution_test::test_dna_complement_panic - should panic ... ok test solution_test::test_reverse_rna_complement_big ... ok test solution_test::test_reverse_rna_complement_empty ... ok test solution_test::test_reverse_rna_complement_panic1 - should panic ... ok test solution_test::test_reverse_rna_complement_panic2 - should panic ... ok test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
История (2 версии и 1 коментар)
Даниел качи решение на 20.10.2021 00:38 (преди почти 4 години)
-#[cfg(test)]
-mod tests {
+pub struct NucleotideCounter {
+ pub a: usize,
+ pub c: usize,
+ pub g: usize,
+ pub t: usize,
+}
- #[test]
- fn counter_simple_test() {
- let input: Vec<char> = "GCAATG".chars().collect();
- let counter = solution::counts(&input);
-
- assert_eq!(counter.g, 2);
- assert_eq!(counter.c, 1);
- assert_eq!(counter.a, 2);
- assert_eq!(counter.t, 1);
+impl NucleotideCounter {
+ fn empty_counter () -> NucleotideCounter {
+ NucleotideCounter {
+ a: 0,
+ c: 0,
+ g: 0,
+ t: 0
+ }
}
+}
- #[test]
- #[should_panic]
- fn counter_panic_test() {
- let input: Vec<char> = "GCaAATG".chars().collect();
- solution::counts(&input);
- }
+pub fn counts(dna: &[char]) -> NucleotideCounter {
+ let mut counter = NucleotideCounter::empty_counter();
- #[test]
- fn dna_complement_simple_test() {
- let input: Vec<char> = "GCAATG".chars().collect();
- assert_eq!(solution::dna_complement(&input), vec!['C', 'G', 'T', 'T', 'A', 'C']);
+ for nucleotide in dna {
+ match nucleotide {
+ 'A' => counter.a = counter.a + 1,
+ 'C' => counter.c = counter.c + 1,
+ 'G' => counter.g = counter.g + 1,
+ 'T' => counter.t = counter.t + 1,
+ _ => panic!("Грешка, грешка, обърках вратата"),
+ }
}
+ counter
+}
- #[test]
- #[should_panic]
- fn dna_complement_panic_test() {
- let input: Vec<char> = "GCAA,TG".chars().collect();
- solution::dna_complement(&input);
- }
+pub fn dna_complement(dna: &[char]) -> Vec<char> {
+ let mut complements: Vec<char> = Vec::new();
- #[test]
- fn reverse_rna_complement_simple_test() {
- let input: Vec<char> = "GCTAAC".chars().collect();
- assert_eq!(solution::reverse_rna_complement(&input), vec!['G', 'U', 'U', 'A', 'G', 'C']);
+ for nucleotide in dna {
+ match nucleotide {
+ 'A' => complements.push('T'),
+ 'C' => complements.push('G'),
+ 'G' => complements.push('C'),
+ 'T' => complements.push('A'),
+ _ => panic!("Грешка, грешка, обърках вратата"),
+ }
}
- #[test]
- #[should_panic]
- fn reverse_rna_complement_panic_test() {
- let input: Vec<char> = "GCTAA,C".chars().collect();
- solution::reverse_rna_complement(&input);
- }
+ complements
}
+
+pub fn reverse_rna_complement(dna: &[char]) -> Vec<char> {
+ let mut complements: Vec<char> = Vec::new();
+
+ for nucleotide in dna.iter().rev() {
+ match nucleotide {
+ 'A' => complements.push('U'),
+ 'C' => complements.push('G'),
+ 'G' => complements.push('C'),
+ 'T' => complements.push('A'),
+ _ => panic!("Грешка, грешка, обърках вратата"),
+ }
+ }
+
+ complements
+}
Разумно решение. Вместо counter.a = counter.a + 1
, counter.a += 1
също работи и ти позволява да избегнеш малко повторение.