Решение на Дигитален корен от Ангел Беширов
Резултати
- 20 точки от тестове
- 0 бонус точки
- 20 точки общо
- 6 успешни тест(а)
- 0 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20200111-2173579-16rljar/solution) Finished test [unoptimized + debuginfo] target(s) in 1.53s 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
История (3 версии и 2 коментара)
Ангел качи решение на 04.11.2019 22:33 (преди почти 6 години)
/// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
- digital_root(input, 10)
+ digital_root(input, 10)
}
/// Шестнадесетична бройна система: 0-9, последвано от a-f
pub fn hex(input: &str) -> Option<u32> {
- digital_root(input, 16)
+ digital_root(input, 16)
}
/// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
- digital_root(input, 8)
+ digital_root(input, 8)
}
/// Двоична бройна система: 0-1
pub fn binary(input: &str) -> Option<u32> {
digital_root(input, 2)
}
fn digital_root(input: &str, base: u32) -> Option<u32> {
- match u32::from_str_radix(input, base).ok() {
- None => None,
- Some(x) => if x == 0 {
- Some(x)
- } else {
- Some(get_digital_root(x, base))
- },
+ match u32::from_str_radix(input, base).ok() {
+ None => None,
+ Some(x) => if x == 0 {
+ Some(x)
+ } else {
+ Some(get_digital_root(x, base))
+ },
}
}
fn get_digital_root(value: u32, base: u32) -> u32 {
- let mut sum: u32 = 0;
- let mut x: u32 = value;
-
- loop {
- while x > 0 {
- sum += x % base;
- x /= base;
- }
-
- if sum < base {
- break;
- }
-
- x = sum;
- sum = 0;
- }
-
- sum
+ let mut sum: u32 = 0;
+ let mut x: u32 = value;
+
+ loop {
+ while x > 0 {
+ sum += x % base;
+ x /= base;
+ }
+
+ if sum < base {
+ break;
+ }
+
+ x = sum;
+ sum = 0;
+ }
+
+ sum
}
Ангел качи решение на 04.11.2019 22:36 (преди почти 6 години)
/// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
- digital_root(input, 10)
+ digital_root(input, 10)
}
/// Шестнадесетична бройна система: 0-9, последвано от a-f
pub fn hex(input: &str) -> Option<u32> {
- digital_root(input, 16)
+ digital_root(input, 16)
}
/// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
- digital_root(input, 8)
+ digital_root(input, 8)
}
/// Двоична бройна система: 0-1
pub fn binary(input: &str) -> Option<u32> {
digital_root(input, 2)
}
fn digital_root(input: &str, base: u32) -> Option<u32> {
- match u32::from_str_radix(input, base).ok() {
- None => None,
- Some(x) => if x == 0 {
- Some(x)
- } else {
- Some(get_digital_root(x, base))
- },
+ match u32::from_str_radix(input, base).ok() {
+ None => None,
+ Some(x) => if x == 0 {
+ Some(x)
+ } else {
+ Some(get_digital_root(x, base))
+ },
}
}
Метода .ok()
е удобен ако искаш да използваш оператор ?
тук или директно да го върнеш от функцията, но не е много полезен в случая. Можеш да пренапишеш match statement-а с Result
вместо с Option
и ще е почти същото, просто няма да има този допълнителен conversion:
match u32::from_str_radix(input, base) {
Err(_) => None,
Ok(x) => if x == 0 {
Some(x)
} else {
Some(get_digital_root(x, base))
},
}
Другото нещо е, че не съм сигурен дали е нужно тук да сложиш тази проверка anyway. И в двата случая връщаш Some
нещо, така че защо не разчиташ на get_digital_root
да върне 0 ако входа е 0? (Което и мисля, че кода ще направи и сега.)
Аз бих написал този код като първа версия и след като го изтествам внимателно, бих пробвал да направя тази промяна и да пусна тестовете пак, за да се подсигуря че работи.
fn get_digital_root(value: u32, base: u32) -> u32 {
- let mut sum: u32 = 0;
- let mut x: u32 = value;
+ let mut sum: u32 = 0;
+ let mut x: u32 = value;
- loop {
- while x > 0 {
- sum += x % base;
- x /= base;
- }
+ loop {
+ while x > 0 {
+ sum += x % base;
+ x /= base;
+ }
- if sum < base {
- break;
- }
-
- x = sum;
- sum = 0;
- }
+ if sum < base {
+ break;
+ }
- sum
+ x = sum;
+ sum = 0;
+ }
+
+ sum
}
Добро решение, кратко и смислено.
Метода
.ok()
е удобен ако искаш да използваш оператор?
тук или директно да го върнеш от функцията, но не е много полезен в случая. Можеш да пренапишеш match statement-а сResult
вместо сOption
и ще е почти същото, просто няма да има този допълнителен conversion:Другото нещо е, че не съм сигурен дали е нужно тук да сложиш тази проверка anyway. И в двата случая връщаш
Some
нещо, така че защо не разчиташ наget_digital_root
да върне 0 ако входа е 0? (Което и мисля, че кода ще направи и сега.)Аз бих написал този код като първа версия и след като го изтествам внимателно, бих пробвал да направя тази промяна и да пусна тестовете пак, за да се подсигуря че работи.