Решение на Дигитален корен от Явор Иванов
Резултати
- 20 точки от тестове
- 0 бонус точки
- 20 точки общо
- 6 успешни тест(а)
- 0 неуспешни тест(а)
Код
Лог от изпълнението
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 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)
}
Разумно решение, добра работа.
Вместо да правиш
if let
в началото на функцията, за да валидираш коректно число, можеш да направиш проверката тук и да сложиш едноreturn None
ако цифрата не е валидна за тази бройна система. Това едва ли ще е по-бавно -- функциятаu32::from_str_radix
трябва да мине по символите така или иначе.