Решение на Дигитален корен от Людмил Данаилов

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

Към профила на Людмил Данаилов

Резултати

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

Код

/// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
for character in input.chars() {
if !(character > '0' && character < '9') {
return Result::Err(false).ok();

Няма причина да конструираш грешка, която съдържа произволна стойност, и после да ѝ викнеш .ok() за да я конвертираш. Този ред е напълно еквивалентен просто на return None. Дадохме hint-а за метода .ok() в случай, че извикате функция от стандартната библиотека, която ви връща грешка и искате лесен начин да върнете None.

}
}
if input.chars().count() == 1
{
return Some(input.chars().next().unwrap().to_digit(10).unwrap());
}
let mut tmp_sum = 0;
for character in input.chars() {
let tmp: u32 = character.to_digit(10).unwrap();

Вместо тук да викаш unwrap(), можеше да провериш дали to_digit ти връща някаква стойност, или None. Във втория случай, можеше директно да върнеш None от функцията. Ако беше избрал да си конструираш така кода, горната валидация става ненужна. To be fair, повечето от вас са разделили валидацията и processing-а :).

tmp_sum += tmp;
}
return decimal(&tmp_sum.to_string());
}
/// Шестнадесетична бройна система: 0-9, последвано от a-f
pub fn hex(input: &str) -> Option<u32> {
for character in input.chars() {
if !((character >= '0' && character <= '9') || (character >= 'a' && character <= 'f')) {
return Result::Err(false).ok();
}
}
if input.chars().count() == 1
{
let tmp = input.chars().next().unwrap().to_digit(16).unwrap();
return Some(tmp);
}
let mut tmp_sum = 0;
for character in input.chars() {
let tmp: u32 = character.to_digit(16).unwrap();
tmp_sum += tmp;
}
return hex(&format!("{:x}", tmp_sum));
}
/// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
for character in input.chars() {
if !(character >= '0' && character <= '7') {
return Result::Err(false).ok();
}
}
if input.chars().count() == 1
{
let tmp = input.chars().next().unwrap().to_digit(8).unwrap();
return Some(tmp);
}
let mut tmp_sum = 0;
for character in input.chars() {
let tmp: u32 = character.to_digit(8).unwrap();
tmp_sum += tmp;
}
return octal(&format!("{:o}", tmp_sum));
}
/// Двоична бройна система: 0-1
pub fn binary(input: &str) -> Option<u32> {
for character in input.chars() {
if !(character >= '0' && character <= '1') {
return Result::Err(false).ok();
}
}
if input.chars().count() == 1
{
let tmp = input.chars().next().unwrap().to_digit(2).unwrap();
return Some(tmp);
}
let mut tmp_sum = 0;
for character in input.chars() {
let tmp: u32 = character.to_digit(2).unwrap();
tmp_sum += tmp;
}
return binary(&format!("{:b}", tmp_sum));
}

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

Compiling solution v0.1.0 (/tmp/d20200111-2173579-nlpwki/solution)
    Finished test [unoptimized + debuginfo] target(s) in 4.36s
     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 ... FAILED
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 ... FAILED

failures:

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

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


failures:
    solution_test::test_decimal_basic
    solution_test::test_zeroes

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

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

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

Людмил качи първо решение на 05.11.2019 12:09 (преди почти 6 години)

И теб те съветвам да си тестваш кода по-внимателно. Десетичния вариант има бъг, който можеше да хванеш с по-обстойно тестване. Иначе не си се справил зле, но си задай въпроса как би могъл да си структурираш кода, че да нямаш нужда от .unwrap.