Решение на Дигитален корен от Йоан Стоянов

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

Към профила на Йоан Стоянов

Резултати

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

Код

/// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
let x = digital_root(input, 10);
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);
match x {
Ok(x) => Some(x),
Err(_) => None
}
}
// /// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
let x = digital_root(input, 8);
match x {
Ok(x) => Some(x),
Err(_) => None
}
}
// /// Двоична бройна система: 0-1
pub fn binary(input: &str) -> Option<u32> {
let x = digital_root(input, 2);
match x {
Ok(x) => Some(x),
Err(_) => None
}
}
fn digital_root(input: &str, base: u32) -> Result<u32, String>{
let mut save: u32;
let mut s: String = input.to_string();
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);
if digit >= base {
return Err("Bad Char".to_string())
}
save = save + digit;
}
s = match base {
2 => format!("{:b}",save),
8 => format!("{:o}",save),
10 => format!("{}",save),
16 => format!("{:x}",save),
_ => return Err("Bad String".to_string())
};
if s.chars().count() <= 1 {
break
}
}
let x = s.chars().next().unwrap();
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,
_ => 666
}
}

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

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:02 (преди почти 6 години)

Йоан качи решение на 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())
+ }
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
}
}