Решение на Дигитален корен от Явор Иванов

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

Към профила на Явор Иванов

Резултати

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

Код

fn calc_digital_root(input: &str, radix: u32) -> Option<u32> {
if let Err(_) = u32::from_str_radix(input, radix) {
return None;
};
let mut num_str = input.to_string();
loop {
let mut sum = 0u32;
for c in num_str.chars() {
sum += c.to_digit(radix).unwrap();
}

Вместо да правиш if let в началото на функцията, за да валидираш коректно число, можеш да направиш проверката тук и да сложиш едно return None ако цифрата не е валидна за тази бройна система. Това едва ли ще е по-бавно -- функцията u32::from_str_radix трябва да мине по символите така или иначе.

if sum < radix {
return Some(sum);
}
if radix != 10 {
num_str.clear();
while sum != 0 {
num_str.push(std::char::from_digit(sum % radix, radix).unwrap());
sum /= radix;
}
}
else {
num_str = sum.to_string();
}
}
}
/// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
calc_digital_root(input, 10)
}
/// Шестнадесетична бройна система: 0-9, последвано от a-f
pub fn hex(input: &str) -> Option<u32> {
calc_digital_root(input, 16)
}
/// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
calc_digital_root(input, 8)
}
/// Двоична бройна система: 0-1
pub fn binary(input: &str) -> Option<u32> {
calc_digital_root(input, 2)
}

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

Compiling solution v0.1.0 (/tmp/d20200111-2173579-arywb3/solution)
    Finished test [unoptimized + debuginfo] target(s) in 3.60s
     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

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

Явор качи първо решение на 05.11.2019 00:56 (преди почти 6 години)

Явор качи решение на 05.11.2019 01:45 (преди почти 6 години)

fn calc_digital_root(input: &str, radix: u32) -> Option<u32> {
if let Err(_) = u32::from_str_radix(input, radix) {
return None;
};
let mut num_str = input.to_string();
loop {
- println!("{}", num_str);
let mut sum = 0u32;
for c in num_str.chars() {
sum += c.to_digit(radix).unwrap();
}

Вместо да правиш if let в началото на функцията, за да валидираш коректно число, можеш да направиш проверката тук и да сложиш едно return None ако цифрата не е валидна за тази бройна система. Това едва ли ще е по-бавно -- функцията u32::from_str_radix трябва да мине по символите така или иначе.

if sum < radix {
return Some(sum);
}
- num_str = sum.to_string();
+ if radix != 10 {
+ num_str.clear();
+ while sum != 0 {
+ num_str.push(std::char::from_digit(sum % radix, radix).unwrap());
+ sum /= radix;
+ }
+ }
+ else {
+ num_str = sum.to_string();
+ }
}
}
/// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
calc_digital_root(input, 10)
}
/// Шестнадесетична бройна система: 0-9, последвано от a-f
pub fn hex(input: &str) -> Option<u32> {
calc_digital_root(input, 16)
}
/// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
calc_digital_root(input, 8)
}
/// Двоична бройна система: 0-1
pub fn binary(input: &str) -> Option<u32> {
calc_digital_root(input, 2)
}