Решение на Дигитален корен от Мирослав Лалев

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

Към профила на Мирослав Лалев

Резултати

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

Код

use std::str::Chars;
use std::char;
/// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
dig_root(parse_input(input, 10)?, 10)
}
/// Шестнадесетична бройна система: 0-9, последвано от a-f
pub fn hex(input: &str) -> Option<u32> {
dig_root(parse_input(input, 16)?, 16)
}
/// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
dig_root(parse_input(input, 8)?, 8)
}
/// Двоична бройна система: 0-1
pub fn binary(input: &str) -> Option<u32> {
match parse_input(input, 2) {
Some(n) if n > 0 => Some(1),
None => None,
_ => unreachable!()
}
}
fn parse_input(input: &str, base: u32) -> Option<u32> {
let mut num: u32 = 0;
for ch in input.chars() {
match ch.to_digit(base) {
Some(n) => num+=n,
None => return None
}
}
Some(num)
}
fn dig_root(num: u32, base: u32) -> Option<u32> {
if num < base {
return Some(num);
}
let mut tmp = num;
let mut res = 0;
while tmp > 0 {
res += (tmp % base);
tmp /= base;
}
dig_root(res, base)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_hex() {
assert_eq!(hex("123"), Some(6));
assert_eq!(hex("ff"), Some(15));
assert_eq!(hex("1f2f3f"), Some(6));
assert_eq!(hex("invalidHex"), None);
assert_eq!(hex("-f"), None);
}
#[test]
fn test_dec() {
assert_eq!(decimal("123"), Some(6));
assert_eq!(decimal("99"), Some(9));
assert_eq!(decimal("192939"), Some(6));
assert_eq!(decimal("invalidDec"), None);
assert_eq!(decimal("-9"), None);
}
#[test]
fn test_oct() {
assert_eq!(octal("123"), Some(6));
assert_eq!(octal("77"), Some(7));
assert_eq!(octal("172737"), Some(6));
assert_eq!(octal("invalidOct"), None);
assert_eq!(octal("-7"), None);
}
#[test]
fn test_bin() {
assert_eq!(binary("1"), Some(1));
assert_eq!(binary("0"), Some(0));
assert_eq!(binary("11"), Some(1));
assert_eq!(binary("invalidBin"), None);
assert_eq!(binary("-1"), None);
}
}

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

Compiling solution v0.1.0 (/tmp/d20200111-2173579-sk45nm/solution)
warning: unused import: `std::str::Chars`
 --> src/lib.rs:1:5
  |
1 | use std::str::Chars;
  |     ^^^^^^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: unused import: `std::char`
 --> src/lib.rs:2:5
  |
2 | use std::char;
  |     ^^^^^^^^^

warning: unnecessary parentheses around assigned value
  --> src/lib.rs:48:16
   |
48 |         res += (tmp % base);
   |                ^^^^^^^^^^^^ help: remove these parentheses
   |
   = note: `#[warn(unused_parens)]` on by default

warning: unused import: `std::str::Chars`
 --> src/lib.rs:1:5
  |
1 | use std::str::Chars;
  |     ^^^^^^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: unused import: `std::char`
 --> src/lib.rs:2:5
  |
2 | use std::char;
  |     ^^^^^^^^^

warning: unnecessary parentheses around assigned value
  --> src/lib.rs:48:16
   |
48 |         res += (tmp % base);
   |                ^^^^^^^^^^^^ help: remove these parentheses
   |
   = note: `#[warn(unused_parens)]` on by default

    Finished test [unoptimized + debuginfo] target(s) in 2.06s
     Running target/debug/deps/solution-a73e64ec87929bd0

running 4 tests
test tests::test_bin ... ok
test tests::test_dec ... ok
test tests::test_hex ... ok
test tests::test_oct ... ok

test result: ok. 4 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

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

Мирослав качи първо решение на 02.11.2019 22:17 (преди почти 6 години)

Добро решение. Тестовете са добра добавка, макар че "0" е важен edge case, който щеше също да е добре да се изтества. Все пак ще ти дам 1 бонус точка за допълнителното усилие. На следващите домашни може би ще бъда по-придирчив при категоризирането на тестове като "добри" :).