Решение на Сметки с ДНК от Антонио Георгиев

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

Към профила на Антонио Георгиев

Резултати

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

Код

pub struct NucleotideCounter {
pub a: usize,
pub c: usize,
pub g: usize,
pub t: usize,
}
pub fn increment_counter(nuc_counter: &mut NucleotideCounter, dna_value: char) -> () {
if dna_value == 'A' {
nuc_counter.a = nuc_counter.a + 1
} else if dna_value == 'C' {
nuc_counter.c = nuc_counter.c + 1
}else if dna_value == 'G' {
nuc_counter.g = nuc_counter.g + 1
}else if dna_value == 'T' {
nuc_counter.t = nuc_counter.t + 1
} else {
panic!("Грешка, грешка, обърках вратата");
}
}
pub fn counts(dna: &[char]) -> NucleotideCounter {
let mut nuc_counter = NucleotideCounter {
a: 0,
c: 0,
g: 0,
t:0
};
for i in dna {
increment_counter(&mut nuc_counter, *i)
}
nuc_counter
}
pub fn match_bases(base: char, vec: &mut Vec<char>) -> () {
if base == 'A' {
vec.push('T');
} else if base == 'C' {
vec.push('G');
}else if base == 'G' {
vec.push('C');
}else if base == 'T' {
vec.push('A');
} else {
panic!("Грешка, грешка, обърках вратата");
}
}
pub fn dna_complement(dna: &[char]) -> Vec<char> {
let mut vec = Vec::new();
for i in dna {
match_bases(*i, &mut vec);
}
vec
}
pub fn change_rna_base(vec: &mut Vec<char>) -> () {
for i in vec.iter_mut() {
if *i == 'T' {
*i = 'U';
}
}
}
pub fn revert_vector(vec: &mut Vec<char>) -> Vec<char>{
let mut reversed_vec = Vec::<char>::new();
for i in vec.iter().rev() {
reversed_vec.push(*i);
}
reversed_vec
}
pub fn reverse_rna_complement(dna: &[char]) -> Vec<char> {
let mut vec = dna_complement(dna);
change_rna_base(&mut vec);
return revert_vector(&mut vec);
}

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

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

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

Антонио качи първо решение на 21.10.2021 00:56 (преди почти 4 години)

Работещо решение, макар че е разбито малко на ситно. Няма лошо да си организираш кода на по-малки части, но има смисъл да го правиш, ако 1) тази част се преизползва и може да ѝ се даде смислено име, или 2) кода в една функция става твърде много и труден за четене.

Примерно, reverse_rna_complement разбито на 3 части има смисъл, донякъде, като "много код, разбит на high-level компоненти". От друга страна, match_bases и increment_counters извадени от мястото, на което се използват, само увеличава индирекцията, слага едно допълнително място, на което трябва да скочи човек, за да разбере кода.

As a side note, обръщането на вектор го има в стандартната библиотека: https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.reverse