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

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

Към профила на Антон Чернев

Резултати

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

Код

fn parse_input(input: &str, base: u32) -> Option<Vec<u32>> {
let mut digits: Vec<u32> = Vec::new();
for symbol in input.chars() {
if let Some(digit) = symbol.to_digit(base) {
digits.push(digit);
} else {
return None;
}

Използвайки оператора ?, може този код да се пренапише така:

for symbol in input.chars() {
    digits.push(symbol.to_digit(base)?);
}

Бих казал, че в случая е донякъде въпрос на вкус.

}
Some(digits)
}
fn get_digits(mut number: u32, base: u32) -> Vec<u32> {
if number == 0 {
return [0].to_vec();
}
let mut digits: Vec<u32> = Vec::new();
while number > 0 {
digits.push(number % base);
number /= base;
}
digits
}
fn calculate(digits: Vec<u32>, base: u32) -> u32 {
let mut sum: u32 = 0;
for digit in digits.iter() {
sum += digit;
}
if sum < base {
sum
} else {
calculate(get_digits(sum, base), base)
}
}
fn find_digital_root(input: &str, base: u32) -> Option<u32> {
match parse_input(input, base) {
Some(digits) => Some(calculate(digits, base)),
None => None
}
}
pub fn decimal(input: &str) -> Option<u32> {
find_digital_root(input, 10)
}
pub fn hex(input: &str) -> Option<u32> {
find_digital_root(input, 16)
}
pub fn octal(input: &str) -> Option<u32> {
find_digital_root(input, 8)
}
pub fn binary(input: &str) -> Option<u32> {
find_digital_root(input, 2)
}

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

Compiling solution v0.1.0 (/tmp/d20200111-2173579-19r9pcj/solution)
    Finished test [unoptimized + debuginfo] target(s) in 1.85s
     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 коментара)

Антон качи първо решение на 02.11.2019 20:24 (преди почти 6 години)

Антон качи решение на 03.11.2019 00:01 (преди почти 6 години)

fn parse_input(input: &str, base: u32) -> Option<Vec<u32>> {
let mut digits: Vec<u32> = Vec::new();
for symbol in input.chars() {
if let Some(digit) = symbol.to_digit(base) {
digits.push(digit);
} else {
return None;
}

Използвайки оператора ?, може този код да се пренапише така:

for symbol in input.chars() {
    digits.push(symbol.to_digit(base)?);
}

Бих казал, че в случая е донякъде въпрос на вкус.

}
Some(digits)
}
fn get_digits(mut number: u32, base: u32) -> Vec<u32> {
if number == 0 {
return [0].to_vec();
}
let mut digits: Vec<u32> = Vec::new();
while number > 0 {
digits.push(number % base);
number /= base;
}
digits
}
fn calculate(digits: Vec<u32>, base: u32) -> u32 {
let mut sum: u32 = 0;
for digit in digits.iter() {
sum += digit;
}
if sum < base {
sum
} else {
calculate(get_digits(sum, base), base)
}
}
fn find_digital_root(input: &str, base: u32) -> Option<u32> {
match parse_input(input, base) {
- Some(digits) => {
- Some(calculate(digits, base))
- }
+ Some(digits) => Some(calculate(digits, base)),
None => None
}
}
pub fn decimal(input: &str) -> Option<u32> {
find_digital_root(input, 10)
}
pub fn hex(input: &str) -> Option<u32> {
find_digital_root(input, 16)
}
pub fn octal(input: &str) -> Option<u32> {
find_digital_root(input, 8)
}
pub fn binary(input: &str) -> Option<u32> {
find_digital_root(input, 2)
}