Решение на Дигитален корен от Йоан Стоянов
Резултати
- 20 точки от тестове
- 0 бонус точки
- 20 точки общо
- 6 успешни тест(а)
- 0 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20200111-2173579-1s0a51t/solution) Finished test [unoptimized + debuginfo] target(s) in 1.67s 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 коментара)
Йоан качи решение на 05.11.2019 16:48 (преди почти 6 години)
/// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
let x = digital_root(input, 10);
- return Some(x);
+
+ match x {
+ Ok(x) => Some(x),
+ Err(_) => None
+ }
}
// /// Шестнадесетична бройна система: 0-9, последвано от a-f
pub fn hex(input: &str) -> Option<u32> {
let x = digital_root(input, 16);
- return Some(x);
+ match x {
+ Ok(x) => Some(x),
+ Err(_) => None
+ }
}
// /// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
let x = digital_root(input, 8);
- return Some(x);
+ match x {
+ Ok(x) => Some(x),
+ Err(_) => None
+ }
}
// /// Двоична бройна система: 0-1
pub fn binary(input: &str) -> Option<u32> {
let x = digital_root(input, 2);
- return Some(x);
+ match x {
+ Ok(x) => Some(x),
+ Err(_) => None
+ }
}
-fn digital_root(input: &str, system: u32) -> u32{
+fn digital_root(input: &str, base: u32) -> Result<u32, String>{
let mut save: u32;
let mut s: String = input.to_string();
- while s.chars().count() > 1 {
+ if s.chars().count() < 1 {
+ return Err("Bad Input".to_string())
+ }
+ loop {
+
save = 0;
for c in s.chars() {
let digit = char_to_num(c);
- println!("{}",digit);
+ if digit >= base {
+ return Err("Bad Char".to_string())
+ }
Вместо char_to_num
можеше да използваш char::to_digit(base)
и да провериш дали е Some
или None
. Щеше да ти премахне нуждата от експлицитен списък.
save = save + digit;
}
- s = match system {
+ s = match base {
2 => format!("{:b}",save),
8 => format!("{:o}",save),
10 => format!("{}",save),
16 => format!("{:x}",save),
- _ => format!(""),
+ _ => return Err("Bad String".to_string())
};
- println!("{}",s);
+ if s.chars().count() <= 1 {
+ break
+ }
}
-
let x = s.chars().next().unwrap();
- char_to_num(x)
+ Ok(char_to_num(x))
}
fn char_to_num(c: char) -> u32 {
match c {
'0' => 0,
'1' => 1,
'2' => 2,
'3' => 3,
'4' => 4,
'5' => 5,
'6' => 6,
'7' => 7,
'8' => 8,
'9' => 9,
'a' => 10,
'b' => 11,
'c' => 12,
'd' => 13,
'e' => 14,
'f' => 15,
- _ => 0
+ _ => 666
}
}
Добро решение. Има логика да връщаш Result
вместо Option
, но не го бяхме взели за първо домашно :).
Вместо
char_to_num
можеше да използвашchar::to_digit(base)
и да провериш дали еSome
илиNone
. Щеше да ти премахне нуждата от експлицитен списък.