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

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

Към профила на Даниел Пенчев

Резултати

  • 20 точки от тестове
  • 1 бонус точка
  • 21 точки общо
  • 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 result = NucleotideCounter{
a: 0,
c: 0,
g: 0,
t: 0,
};
for ch in dna{
match ch {
'A' => result.a += 1,
'C' => result.c += 1,
'G' => result.g += 1,
'T' => result.t += 1,
_ => panic!("☭ The purge solves all problems. No chars no problems ☭"),
}
}
result
}
pub fn dna_complement(dna: &[char]) -> Vec<char> {
let mut result = Vec::new();
for ch in dna{
match ch {
'A' => result.push('T'),
'T' => result.push('A'),
'G' => result.push('C'),
'C' => result.push('G'),
_ => panic!("🎆")
}
}
result
}
pub fn reverse_rna_complement(dna: &[char]) -> Vec<char> {
let mut result = Vec::new();
for ch in dna.iter().rev(){
match ch {
'A' => result.push('U'),
'T' => result.push('A'),
'G' => result.push('C'),
'C' => result.push('G'),
_ => panic!("🎆")
}
}
result
}
#[cfg(test)]
mod test{
use super::*;
#[test]
fn test_counts_all_valid_symbols() {
let input: Vec<char> = vec!['A','G','T','C','G','T','C','T','C','C'];
let counter = counts(&input);
assert_eq!(counter.a, 1);
assert_eq!(counter.g, 2);
assert_eq!(counter.t, 3);
assert_eq!(counter.c, 4);
}
#[test]
fn test_counts_empty_input() {
let input: Vec<char> = Vec::new();
let counter = counts(&input);
assert_eq!(counter.a, 0);
assert_eq!(counter.g, 0);
assert_eq!(counter.t, 0);
assert_eq!(counter.c, 0);
}
#[test]
#[should_panic]
fn test_counts_invalid_symbol() {
let input: Vec<char> = vec!['A','T','F'];
counts(&input);
}
#[test]
#[should_panic]
fn test_counts_utf8() {
let input: Vec<char> = vec!['A','T','🎆'];
counts(&input);
}
#[test]
fn test_dna_complement_valid_dna_sequence(){
let input: Vec<char> = vec!['A','G','T','C'];
let sequence = dna_complement(&input);
assert_eq!(sequence,vec!['T','C','A','G'])
}
#[test]
fn test_dna_complement_empty_input(){
let input: Vec<char> = Vec::new();
let sequence = dna_complement(&input);
assert_eq!(sequence,Vec::new())
}
#[test]
#[should_panic]
fn test_dna_complement_invalid_dna_sequence(){
let input: Vec<char> = vec!['A','G','T','C','F'];
dna_complement(&input);
}
#[test]
#[should_panic]
fn test_dna_complement_utf8() {
let input: Vec<char> = vec!['A','T','🎆'];
dna_complement(&input);
}
#[test]
fn test_reverse_rna_complement_valid_dna_sequence(){
let input: Vec<char> = vec!['A','G','T','C'];
let sequence = reverse_rna_complement(&input);
assert_eq!(sequence,vec!['G','A','C','U'])
}
#[test]
fn test_reverse_rna_complement_empty_input(){
let input: Vec<char> = Vec::new();
let sequence = reverse_rna_complement(&input);
assert_eq!(sequence,Vec::new())
}
#[test]
#[should_panic]
fn test_reverse_rna_complement_invalid_dna_sequence(){
let input: Vec<char> = vec!['A','G','T','C','F'];
reverse_rna_complement(&input);
}
#[test]
#[should_panic]
fn test_reverse_rna_complement_utf8() {
let input: Vec<char> = vec!['A','T','🎆'];
reverse_rna_complement(&input);
}
}

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

Compiling solution v0.1.0 (/tmp/d20220112-2706256-cotjmk/solution)
    Finished test [unoptimized + debuginfo] target(s) in 5.83s
     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 коментар)

Даниел качи първо решение на 21.10.2021 19:04 (преди почти 4 години)

Даниел качи решение на 21.10.2021 21:30 (преди почти 4 години)

pub struct NucleotideCounter {
pub a: usize,
pub c: usize,
pub g: usize,
pub t: usize,
}
pub fn counts(dna: &[char]) -> NucleotideCounter {
let mut result = NucleotideCounter{
a: 0,
c: 0,
g: 0,
t: 0,
};
for ch in dna{
match ch {
'A' => result.a += 1,
'C' => result.c += 1,
'G' => result.g += 1,
'T' => result.t += 1,
_ => panic!("☭ The purge solves all problems. No chars no problems ☭"),
}
}
result
}
pub fn dna_complement(dna: &[char]) -> Vec<char> {
let mut result = Vec::new();
for ch in dna{
match ch {
'A' => result.push('T'),
'T' => result.push('A'),
'G' => result.push('C'),
'C' => result.push('G'),
_ => panic!("🎆")
}
}
result
}
pub fn reverse_rna_complement(dna: &[char]) -> Vec<char> {
let mut result = Vec::new();
for ch in dna.iter().rev(){
match ch {
'A' => result.push('U'),
'T' => result.push('A'),
'G' => result.push('C'),
'C' => result.push('G'),
_ => panic!("🎆")
}
}
result
}
+
+#[cfg(test)]
+mod test{
+ use super::*;
+
+ #[test]
+ fn test_counts_all_valid_symbols() {
+ let input: Vec<char> = vec!['A','G','T','C','G','T','C','T','C','C'];
+ let counter = counts(&input);
+
+ assert_eq!(counter.a, 1);
+ assert_eq!(counter.g, 2);
+ assert_eq!(counter.t, 3);
+ assert_eq!(counter.c, 4);
+ }
+
+ #[test]
+ fn test_counts_empty_input() {
+ let input: Vec<char> = Vec::new();
+ let counter = counts(&input);
+
+ assert_eq!(counter.a, 0);
+ assert_eq!(counter.g, 0);
+ assert_eq!(counter.t, 0);
+ assert_eq!(counter.c, 0);
+ }
+
+ #[test]
+ #[should_panic]
+ fn test_counts_invalid_symbol() {
+ let input: Vec<char> = vec!['A','T','F'];
+ counts(&input);
+ }
+
+ #[test]
+ #[should_panic]
+ fn test_counts_utf8() {
+ let input: Vec<char> = vec!['A','T','🎆'];
+ counts(&input);
+ }
+
+ #[test]
+ fn test_dna_complement_valid_dna_sequence(){
+ let input: Vec<char> = vec!['A','G','T','C'];
+ let sequence = dna_complement(&input);
+ assert_eq!(sequence,vec!['T','C','A','G'])
+ }
+
+ #[test]
+ fn test_dna_complement_empty_input(){
+ let input: Vec<char> = Vec::new();
+ let sequence = dna_complement(&input);
+ assert_eq!(sequence,Vec::new())
+ }
+
+ #[test]
+ #[should_panic]
+ fn test_dna_complement_invalid_dna_sequence(){
+ let input: Vec<char> = vec!['A','G','T','C','F'];
+ dna_complement(&input);
+ }
+
+ #[test]
+ #[should_panic]
+ fn test_dna_complement_utf8() {
+ let input: Vec<char> = vec!['A','T','🎆'];
+ dna_complement(&input);
+ }
+
+
+ #[test]
+ fn test_reverse_rna_complement_valid_dna_sequence(){
+ let input: Vec<char> = vec!['A','G','T','C'];
+ let sequence = reverse_rna_complement(&input);
+ assert_eq!(sequence,vec!['G','A','C','U'])
+ }
+
+ #[test]
+ fn test_reverse_rna_complement_empty_input(){
+ let input: Vec<char> = Vec::new();
+ let sequence = reverse_rna_complement(&input);
+ assert_eq!(sequence,Vec::new())
+ }
+
+ #[test]
+ #[should_panic]
+ fn test_reverse_rna_complement_invalid_dna_sequence(){
+ let input: Vec<char> = vec!['A','G','T','C','F'];
+ reverse_rna_complement(&input);
+ }
+
+
+
+ #[test]
+ #[should_panic]
+ fn test_reverse_rna_complement_utf8() {
+ let input: Vec<char> = vec!['A','T','🎆'];
+ reverse_rna_complement(&input);
+ }
+}
+

Добро, просто решение с разумни тестове. UTF8 тест, който да panic-ва може би не е нещо особено полезно. Ако имаш проблем с unicode handling, пак ще получиш паника и теста ти ще мине. В случая няма много значение unicode-а за това домашно, защото директно ви даваме вектор от char-ове вместо низ anyway.