Решение на Дигитален корен от Ангел Беширов

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

Към профила на Ангел Беширов

Резултати

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

Код

/// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
digital_root(input, 10)
}
/// Шестнадесетична бройна система: 0-9, последвано от a-f
pub fn hex(input: &str) -> Option<u32> {
digital_root(input, 16)
}
/// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
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))
},
}
}

Метода .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;
loop {
while x > 0 {
sum += x % base;
x /= base;
}
if sum < base {
break;
}
x = sum;
sum = 0;
}
sum
}

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

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:30 (преди почти 6 години)

Ангел качи решение на 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
}