Решение на Сметки с ДНК от Надежда Панделиева

Обратно към всички решения

Към профила на Надежда Панделиева

Резултати

  • 20 точки от тестове
  • 0 бонус точки
  • 20 точки общо
  • 12 успешни тест(а)
  • 0 неуспешни тест(а)

Код

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); да го оставиш.

}
*/

Лог от изпълнението

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 коментара)

Надежда качи първо решение на 22.10.2021 17:55 (преди почти 4 години)

Надежда качи решение на 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); да го оставиш.

-}
+}
+*/