Решение на Сметки с ДНК от Надежда Панделиева
Към профила на Надежда Панделиева
Резултати
- 20 точки от тестове
- 0 бонус точки
- 20 точки общо
- 12 успешни тест(а)
- 0 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20220112-2706256-12biza2/solution) Finished test [unoptimized + debuginfo] target(s) in 5.63s 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
История (3 версии и 3 коментара)
Надежда качи решение на 24.10.2021 11:49 (преди почти 4 години)
pub struct NucleotideCounter {
pub a: usize,
pub c: usize,
pub g: usize,
pub t: usize,
}
pub fn counts(dna: &[char]) -> NucleotideCounter {
let mut nucleotide_counter = NucleotideCounter{
a: 0,
c: 0,
g: 0,
t: 0,
};
for &base in dna.iter(){
if base == 'A' {
nucleotide_counter.a = nucleotide_counter.a +1;
}else if base == 'G'{
nucleotide_counter.g = nucleotide_counter.g +1;
}else if base == 'T' {
nucleotide_counter.t = nucleotide_counter.t +1;
}else if base == 'C'{
nucleotide_counter.c = nucleotide_counter.c +1;
} else{
panic!("Грешка, грешка, обърках вратата");
}
}
return nucleotide_counter;
}
pub fn dna_complement(dna: &[char]) -> Vec<char> {
let mut create_dna: Vec<char> = Vec::new();
for &base in dna.iter(){
if base == 'A' {
create_dna.push('T');
}else if base == 'G'{
create_dna.push('C');
}else if base == 'T' {
create_dna.push('A');
}else if base == 'C'{
create_dna.push('G');
} else{
panic!("Грешка, грешка, обърках вратата");
}
}
return create_dna;
}
pub fn reverse_rna_complement(dna: &[char]) -> Vec<char> {
let mut create_rna: Vec<char> = Vec::new();
for &base in dna.iter().rev(){
if base == 'A' {
create_rna.push('U');
}else if base == 'G'{
create_rna.push('C');
}else if base == 'T' {
create_rna.push('A');
}else if base == 'C'{
create_rna.push('G');
} else{
panic!("Грешка, грешка, обърках вратата");
}
}
return create_rna;
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_should_pass() {
+ let input: Vec<char> = "GCTAAAACGGGGCGTCC".chars().collect();
+ let counter = super::counts(&input);
+
+ assert_eq!(counter.g, 6);
+ assert_eq!(counter.c, 5);
+ assert_eq!(counter.a, 4);
+ assert_eq!(counter.t, 2);
+
+ assert_eq!(dna_complement(&input), vec!['C', 'G', 'A', 'T', 'T', 'T', 'T', 'G', 'C', 'C', 'C', 'C', 'G', 'C', 'A', 'G', 'G']);
+ assert_eq!(reverse_rna_complement(&input), vec!['G', 'G', 'A', 'C', 'G', 'C', 'C', 'C', 'C', 'G', 'U', 'U', 'U', 'U', 'A', 'G', 'C']);
+ }
+
+ #[test]
+ //#[should_panic(expected = "Грешка, грешка, обърках вратата")]
+ fn test_should_fail() {
+ let input: Vec<char> = "AGCkAgGC".chars().collect();
+ let counter = super::counts(&input);
+
+ assert_eq!(counter.g, 2);
+ assert_eq!(counter.c, 2);
+ assert_eq!(counter.a, 2);
+ assert_eq!(counter.t, 0);
+
+ assert_eq!(dna_complement(&input), vec!['T', 'C', 'G', 'T', 'C', 'C', 'G']);
+ assert_eq!(reverse_rna_complement(&input), vec!['G', 'C', 'C', 'U', 'G', 'C', 'U']);
+
+ }
+
+
}
Надежда качи решение на 25.10.2021 15:53 (преди почти 4 години)
pub struct NucleotideCounter {
pub a: usize,
pub c: usize,
pub g: usize,
pub t: usize,
}
pub fn counts(dna: &[char]) -> NucleotideCounter {
let mut nucleotide_counter = NucleotideCounter{
a: 0,
c: 0,
g: 0,
t: 0,
};
for &base in dna.iter(){
if base == 'A' {
nucleotide_counter.a = nucleotide_counter.a +1;
}else if base == 'G'{
nucleotide_counter.g = nucleotide_counter.g +1;
}else if base == 'T' {
nucleotide_counter.t = nucleotide_counter.t +1;
}else if base == 'C'{
nucleotide_counter.c = nucleotide_counter.c +1;
} else{
panic!("Грешка, грешка, обърках вратата");
}
}
return nucleotide_counter;
}
Може да съкратиш малко логиката като използваш nucleotide_counter.a += 1
. Малко по-лесно може и да е match
вместо if-клаузи, защото всичките клаузи са сравнение за равенство.
pub fn dna_complement(dna: &[char]) -> Vec<char> {
let mut create_dna: Vec<char> = Vec::new();
for &base in dna.iter(){
if base == 'A' {
create_dna.push('T');
}else if base == 'G'{
create_dna.push('C');
}else if base == 'T' {
create_dna.push('A');
}else if base == 'C'{
create_dna.push('G');
} else{
panic!("Грешка, грешка, обърках вратата");
}
}
return create_dna;
}
pub fn reverse_rna_complement(dna: &[char]) -> Vec<char> {
let mut create_rna: Vec<char> = Vec::new();
for &base in dna.iter().rev(){
if base == 'A' {
create_rna.push('U');
}else if base == 'G'{
create_rna.push('C');
}else if base == 'T' {
create_rna.push('A');
}else if base == 'C'{
create_rna.push('G');
} else{
panic!("Грешка, грешка, обърках вратата");
}
}
return create_rna;
}
+/*
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_should_pass() {
let input: Vec<char> = "GCTAAAACGGGGCGTCC".chars().collect();
let counter = super::counts(&input);
assert_eq!(counter.g, 6);
assert_eq!(counter.c, 5);
assert_eq!(counter.a, 4);
assert_eq!(counter.t, 2);
assert_eq!(dna_complement(&input), vec!['C', 'G', 'A', 'T', 'T', 'T', 'T', 'G', 'C', 'C', 'C', 'C', 'G', 'C', 'A', 'G', 'G']);
assert_eq!(reverse_rna_complement(&input), vec!['G', 'G', 'A', 'C', 'G', 'C', 'C', 'C', 'C', 'G', 'U', 'U', 'U', 'U', 'A', 'G', 'C']);
}
#[test]
//#[should_panic(expected = "Грешка, грешка, обърках вратата")]
fn test_should_fail() {
let input: Vec<char> = "AGCkAgGC".chars().collect();
let counter = super::counts(&input);
assert_eq!(counter.g, 2);
assert_eq!(counter.c, 2);
assert_eq!(counter.a, 2);
assert_eq!(counter.t, 0);
assert_eq!(dna_complement(&input), vec!['T', 'C', 'G', 'T', 'C', 'C', 'G']);
assert_eq!(reverse_rna_complement(&input), vec!['G', 'C', 'C', 'U', 'G', 'C', 'U']);
}
В случай, че очакваш теста да panic-не, не си заслужава да слагаш други assert-и по-долу -- даже може да е объркващо, ако някой гледа теста без да забележи should_panic
отгоре. Можеше още на let counter = super::counts(&input);
да го оставиш.
-}
+}
+*/
Разумно решение 👍. Добре е и че си се опитала да напишеш още тестове -- трябва да се упражняват :)
Може да съкратиш малко логиката като използваш
nucleotide_counter.a += 1
. Малко по-лесно може и да еmatch
вместо if-клаузи, защото всичките клаузи са сравнение за равенство.В случай, че очакваш теста да panic-не, не си заслужава да слагаш други assert-и по-долу -- даже може да е объркващо, ако някой гледа теста без да забележи
should_panic
отгоре. Можеше още наlet counter = super::counts(&input);
да го оставиш.