Решение на Сметки с ДНК от Александър Бакалов

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

Към профила на Александър Бакалов

Резултати

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

Код

pub struct NucleotideCounter {
pub a: usize,
pub c: usize,
pub g: usize,
pub t: usize,
}
pub fn dna_complement(dna: &[char]) -> Vec<char> {
let mut result : Vec<char> = Vec::new();
for a in dna {
match a {
'C' => result.push('G'),
'G' => result.push('C'),
'A' => result.push('T'),
'T' => result.push('A'),
_ => panic!("Това не го познавам")
}
}
result
}
pub fn counts(dna: &[char]) -> NucleotideCounter {
let mut result = NucleotideCounter {
a: 0,
c: 0,
g: 0,
t: 0,
};
for &a in dna {
match a {
'C' => result.c += 1,
'G' => result.g += 1,
'A' => result.a += 1,
'T' => result.t += 1,
_ => panic!("Това не го познавам")
}
}
result
}
pub fn reverse_rna_complement(dna: &[char]) -> Vec<char> {
let mut result : Vec<char> = Vec::new();
for a in dna.iter().rev() {
match a {
'C' => result.push('G'),
'G' => result.push('C'),
'A' => result.push('U'),
'T' => result.push('A'),
_ => panic!("Това не го познавам")
}
}
result
}
pub fn check_if_equal(expected: &NucleotideCounter, actual: &NucleotideCounter) -> bool {
if expected.a == actual.a
&& expected.t == actual.t
&& expected.c == actual.c
&& expected.g == actual.g {
return true;
}
false
}
#[test]
fn test_basic() {
let input: Vec<char> = "GC".chars().collect();
let counter = counts(&input);
assert_eq!(counter.g, 1);
assert_eq!(counter.c, 1);
assert_eq!(counter.a, 0);
assert_eq!(counter.t, 0);
assert_eq!(dna_complement(&input), vec!['C', 'G']);
assert_eq!(reverse_rna_complement(&input), vec!['G', 'C']);
}
#[test]
fn count_test() {
let expected_result = NucleotideCounter {
a: 1,
t: 1,
c: 1,
g: 1
};
let actual_result = counts(&['A','C','T','G']);
assert_eq!(check_if_equal(&expected_result, &actual_result), true);

Вместо да използваш отделна функция за сравнението, #[derive(PartialEq)] отгоре на структурата щеше да ти помогне да направиш сравнението директно със assert_eq!(expected_result, actual_result) (и щеше да ти покаже по-ясно какви са разликите).

Иначе, ако имаш някаква булева стойност, вместо assert_eq!(thing, true), можеш да ползваш assert!(thing).

}
#[test]
fn complement_test() {
let complement : String = dna_complement(&['A', 'C', 'T', 'G']).into_iter().collect();
assert_eq!(complement, "TGAC");
}
#[test]
fn rnk_test() {
let reverse_rnk : String = reverse_rna_complement(&['A', 'C']).into_iter().collect();
assert_eq!(reverse_rnk, "GU");
}
#[test]
#[should_panic]
fn panic_test() {
counts(&['A', 'C', 'T', 'H']);
dna_complement(&['A', 'C', 'T', 'H']);
reverse_rna_complement(&['A', 'C', 'T', 'H']);
counts(&['A', 'C', 'T', 'a']);
dna_complement(&['A', 'C', 'a', 'H']);
reverse_rna_complement(&['A', 'C', 'T', 'a']);
counts(&['A', 'C', 'T', '2']);
dna_complement(&['A', '2', 'T', 'H']);
reverse_rna_complement(&['1', 'C', 'T', 'H']);
}

Проблема на този тест е, че първата паника ще го накара да мине, защото спира изпълнението на функцията -- кода след counts(&['A', 'C', 'T', 'H']); просто няма да се изпълни. Вариантите са да се разделят на отделни тестове, или да се ползва catch_unwind директно, което ще ви покажем в някоя бъдеща лекция.

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

Compiling solution v0.1.0 (/tmp/d20220112-2706256-1ypspup/solution)
    Finished test [unoptimized + debuginfo] target(s) in 5.58s
     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.01s

История (2 версии и 3 коментара)

Александър качи първо решение на 23.10.2021 22:00 (преди почти 4 години)

Александър качи решение на 23.10.2021 22:01 (преди почти 4 години)

pub struct NucleotideCounter {
pub a: usize,
pub c: usize,
pub g: usize,
pub t: usize,
}
pub fn dna_complement(dna: &[char]) -> Vec<char> {
let mut result : Vec<char> = Vec::new();
for a in dna {
match a {
'C' => result.push('G'),
'G' => result.push('C'),
'A' => result.push('T'),
'T' => result.push('A'),
_ => panic!("Това не го познавам")
}
}
result
}
pub fn counts(dna: &[char]) -> NucleotideCounter {
let mut result = NucleotideCounter {
a: 0,
c: 0,
g: 0,
t: 0,
};
for &a in dna {
match a {
'C' => result.c += 1,
'G' => result.g += 1,
'A' => result.a += 1,
'T' => result.t += 1,
_ => panic!("Това не го познавам")
}
}
result
}
pub fn reverse_rna_complement(dna: &[char]) -> Vec<char> {
let mut result : Vec<char> = Vec::new();
for a in dna.iter().rev() {
match a {
'C' => result.push('G'),
'G' => result.push('C'),
'A' => result.push('U'),
'T' => result.push('A'),
_ => panic!("Това не го познавам")
}
}
result
-}
+}
+
+pub fn check_if_equal(expected: &NucleotideCounter, actual: &NucleotideCounter) -> bool {
+ if expected.a == actual.a
+ && expected.t == actual.t
+ && expected.c == actual.c
+ && expected.g == actual.g {
+ return true;
+ }
+ false
+}
+
+
+#[test]
+fn test_basic() {
+
+ let input: Vec<char> = "GC".chars().collect();
+ let counter = counts(&input);
+
+ assert_eq!(counter.g, 1);
+ assert_eq!(counter.c, 1);
+ assert_eq!(counter.a, 0);
+ assert_eq!(counter.t, 0);
+
+ assert_eq!(dna_complement(&input), vec!['C', 'G']);
+ assert_eq!(reverse_rna_complement(&input), vec!['G', 'C']);
+}
+
+#[test]
+fn count_test() {
+ let expected_result = NucleotideCounter {
+ a: 1,
+ t: 1,
+ c: 1,
+ g: 1
+ };
+
+ let actual_result = counts(&['A','C','T','G']);
+ assert_eq!(check_if_equal(&expected_result, &actual_result), true);

Вместо да използваш отделна функция за сравнението, #[derive(PartialEq)] отгоре на структурата щеше да ти помогне да направиш сравнението директно със assert_eq!(expected_result, actual_result) (и щеше да ти покаже по-ясно какви са разликите).

Иначе, ако имаш някаква булева стойност, вместо assert_eq!(thing, true), можеш да ползваш assert!(thing).

+
+}
+
+#[test]
+fn complement_test() {
+ let complement : String = dna_complement(&['A', 'C', 'T', 'G']).into_iter().collect();
+ assert_eq!(complement, "TGAC");
+}
+
+#[test]
+fn rnk_test() {
+ let reverse_rnk : String = reverse_rna_complement(&['A', 'C']).into_iter().collect();
+ assert_eq!(reverse_rnk, "GU");
+}
+
+#[test]
+#[should_panic]
+fn panic_test() {
+ counts(&['A', 'C', 'T', 'H']);
+ dna_complement(&['A', 'C', 'T', 'H']);
+ reverse_rna_complement(&['A', 'C', 'T', 'H']);
+ counts(&['A', 'C', 'T', 'a']);
+ dna_complement(&['A', 'C', 'a', 'H']);
+ reverse_rna_complement(&['A', 'C', 'T', 'a']);
+ counts(&['A', 'C', 'T', '2']);
+ dna_complement(&['A', '2', 'T', 'H']);
+ reverse_rna_complement(&['1', 'C', 'T', 'H']);
+}

Проблема на този тест е, че първата паника ще го накара да мине, защото спира изпълнението на функцията -- кода след counts(&['A', 'C', 'T', 'H']); просто няма да се изпълни. Вариантите са да се разделят на отделни тестове, или да се ползва catch_unwind директно, което ще ви покажем в някоя бъдеща лекция.

+