Решение на Дигитален корен от Антон Чернев
Резултати
- 20 точки от тестове
- 0 бонус точки
- 20 точки общо
- 6 успешни тест(а)
- 0 неуспешни тест(а)
Код
Лог от изпълнението
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 коментара)
Антон качи решение на 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)
}
Добро решение, кратко и ясно.
Използвайки оператора
?
, може този код да се пренапише така:Бих казал, че в случая е донякъде въпрос на вкус.