Решение на Дигитален корен от Станимира Влаева

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

Към профила на Станимира Влаева

Резултати

  • 13 точки от тестове
  • 0 бонус точки
  • 13 точки общо
  • 4 успешни тест(а)
  • 2 неуспешни тест(а)

Код

use std::str;
pub fn decimal(input: &str) -> Option<u32> {
digital_root(input, 10)
}
pub fn hex(input: &str) -> Option<u32> {
digital_root(input, 16)
}
pub fn octal(input: &str) -> Option<u32> {
digital_root(input, 8)
}
pub fn binary(input: &str) -> Option<u32> {
digital_root(input, 2)
}
fn digital_root(input: &str, base: u32) -> Option<u32> {
if input.len() == 1 {
return input.parse::<u32>().ok();
}
let chars = input.chars();
let first_root;
match sum_chars(chars, base) {
Some(value) => first_root = value,
None => return None,
}
let last_root = 1 + ((first_root - 1) % (base - 1));

Не съм сигурен какво прави този код :/. Може би има някаква формула, която не знам, но не изглежда да работи коректно, или поне fail-ва тестовете.

Ако вместо горното first_root = value имаше конвертиране на value до низ в правилната бройна система, подаден на рекурсивно извикване на digital_root вероятно щеше да сработи.

Some(last_root)
}
fn sum_chars(chars: str::Chars, base: u32) -> Option<u32> {
let mut sum = 0u32;
for c in chars {
match c.to_digit(base) {
Some(digit) => sum += digit,
None => return None, // invalid character
}
}
Some(sum)
}

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

Compiling solution v0.1.0 (/tmp/d20200111-2173579-oyzcmh/solution)
    Finished test [unoptimized + debuginfo] target(s) in 1.50s
     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 ... FAILED
test solution_test::test_invalid ... FAILED
test solution_test::test_octal_basic ... ok
test solution_test::test_zeroes ... ok

failures:

---- solution_test::test_hex_basic stdout ----
thread 'main' panicked at 'assertion failed: `(left == right)`
  left: `None`,
 right: `Some(10)`', tests/solution_test.rs:25:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

---- solution_test::test_invalid stdout ----
thread 'main' panicked at 'assertion failed: `(left == right)`
  left: `Some(8)`,
 right: `None`', tests/solution_test.rs:64:5


failures:
    solution_test::test_hex_basic
    solution_test::test_invalid

test result: FAILED. 4 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out

error: test failed, to rerun pass '--test solution_test'

История (1 версия и 2 коментара)

Станимира качи първо решение на 05.11.2019 13:11 (преди почти 6 години)

Оставяйки на страна грешката в алгоритъма, кода е добре подреден. Никъде не използваш .unwrap(), за разлика от доста от колегите ти, и много удачно използваш to_digit за валидация.