Решение на Дигитален корен от Митко Чакъров

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

Към профила на Митко Чакъров

Резултати

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

Код

// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
match prepare_input(input, 10) {
Some(v) => return Some(calculate_digital_root(v, 10)),
None => return None
}
}

Оператора ? работи за Option, така че би могъл да съкратиш този код до нещо такова:

let input = prepare_input(input, 10)?;
calculate_digital_root(input, 10)

Разбира се, може и на един ред:

calculate_digital_root(prepare_input(input, 10)?, 10)
/// Шестнадесетична бройна система: 0-9, последвано от a-f
pub fn hex(input: &str) -> Option<u32> {
match prepare_input(input, 16) {
Some(v) => return Some(calculate_digital_root(v, 16)),
None => return None
}
}
/// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
match prepare_input(input, 8) {
Some(v) => return Some(calculate_digital_root(v, 8)),
None => return None
}
}
/// Двоична бройна система: 0-1
pub fn binary(input: &str) -> Option<u32> {
match prepare_input(input, 2) {
Some(v) => return Some(calculate_digital_root(v, 2)),
None => return None
}
}
fn prepare_input(input: &str, radix: u32) -> Option<Vec<u32>> {
let mut v = Vec::new();
for ch in input.chars() {
match ch.to_digit(radix) {
Some(x) => v.push(x),
None => return None
}
}
Some(v)
}
fn calculate_digital_root(v: Vec<u32>, radix: u32) -> u32 {
if v.len() == 1 {
return v[0];
}
let mut sum : u32 = v.iter().sum();
let mut vector_new = Vec::new();
while sum >= radix {
vector_new.push(sum % radix);
sum = sum / radix;
}
vector_new.push(sum);
calculate_digital_root(vector_new, radix)
}

Името vector_new е малко странно -- това е нов вектор само веднъж, когато се инстанцира :). Оттам нататък това не е име, което описва каквото и да е за тази стойност. Какво е vector_new? Може би new_digits, или digit_sums?

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

Compiling solution v0.1.0 (/tmp/d20200111-2173579-1mhz06w/solution)
    Finished test [unoptimized + debuginfo] target(s) in 3.21s
     Running target/debug/deps/solution-a73e64ec87929bd0

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/solution_test-38971695424b36d5

running 6 tests
test solution_test::test_binary ... ok
test solution_test::test_decimal_basic ... ok
test solution_test::test_hex_basic ... ok
test solution_test::test_invalid ... ok
test solution_test::test_octal_basic ... ok
test solution_test::test_zeroes ... ok

test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests solution

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

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

Митко качи първо решение на 04.11.2019 19:02 (преди почти 6 години)

Добро решение. Добре е да помислиш повече за имената, които използваш за функции и променливи. Разбира се, именуването на неща е единия от двата големи проблема в програмирането, така че упражнявай :).