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

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

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

Резултати

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

Код

/// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
digital_root(input, 10)
}
/// Шестнадесетична бройна система: 0-9, последвано от a-f
pub fn hex(input: &str) -> Option<u32> {
digital_root(input, 16)
}
/// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
digital_root(input, 8)
}
/// Двоична бройна система: 0-1
pub fn binary(input: &str) -> Option<u32> {
digital_root(input, 2)
}
fn digital_root(s: &str, radix: u32) -> Option<u32> {
match to_digital(String::from(s), radix) {
None => None,
Some(num) => u32::from_str_radix(&num, radix).ok()
}
}
fn to_digital(s :String, radix: u32) -> Option<String> {

Рядко се пише функция, която да приема String, и в случая не виждам добра причина за това. Викаш .len(), което работи и за str, и после го подаваш на функция, която приема &str anyway.

if s.len() == 0 {
return None
}
if s.len() == 1 {
return Some(s)
}
match digits_sum(&s, radix) {
None => None,
Some(num) => to_digital(to_radix(num, radix), radix)
}
}
fn digits_sum(s: &str, radix: u32) -> Option<u32> {
s.chars().map(|c| c.to_digit(radix)).sum()
}
fn to_radix(num: u32, radix: u32) -> String {
match radix {
2 => format!("{:b}", num),
8 => format!("{:o}", num),
16 => format!("{:x?}", num),
_ => num.to_string()
}
}

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

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

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

Стоян качи първо решение на 03.11.2019 13:31 (преди почти 6 години)

Стоян качи решение на 03.11.2019 17:19 (преди почти 6 години)

/// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
digital_root(input, 10)
}
/// Шестнадесетична бройна система: 0-9, последвано от a-f
pub fn hex(input: &str) -> Option<u32> {
digital_root(input, 16)
}
/// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
digital_root(input, 8)
}
/// Двоична бройна система: 0-1
pub fn binary(input: &str) -> Option<u32> {
digital_root(input, 2)
}
fn digital_root(s: &str, radix: u32) -> Option<u32> {
- match to_decimal(s, radix) {
+ match to_digital(String::from(s), radix) {
None => None,
- Some(num) => to_digital(num, radix)
+ Some(num) => u32::from_str_radix(&num, radix).ok()
}
}
-fn to_decimal(s: &str, radix: u32) -> Option<u32> {
- if s == "" {
+fn to_digital(s :String, radix: u32) -> Option<String> {
+ if s.len() == 0 {
return None
}
- s.char_indices().map(|(idx, c)| {
- match c.to_digit(radix) {
- None => None,
- Some(digit) => Some(digit * radix.pow(s.len() as u32 - 1_u32 - idx as u32))
- }
- }).sum()
-}
-fn to_digital(decimal: u32, radix: u32) -> Option<u32> {
- if decimal < radix {
- return Some(decimal)
+ if s.len() == 1 {
+ return Some(s)
}
- to_digital(digits_sum(decimal, radix), radix)
+ match digits_sum(&s, radix) {
+ None => None,
+ Some(num) => to_digital(to_radix(num, radix), radix)
+ }
}
-fn digits_sum(num: u32, radix: u32) -> u32 {
- let mut num = num;
- let mut sum = 0_u32;
- while num > 0 {
- let digit = num % radix;
- sum = sum + digit;
- num = num / radix;
+fn digits_sum(s: &str, radix: u32) -> Option<u32> {
+ s.chars().map(|c| c.to_digit(radix)).sum()
+}
+
+fn to_radix(num: u32, radix: u32) -> String {
+ match radix {
+ 2 => format!("{:b}", num),
+ 8 => format!("{:o}", num),
+ 16 => format!("{:x?}", num),
+ _ => num.to_string()
}
- sum
-}
+}

Стоян качи решение на 03.11.2019 17:30 (преди почти 6 години)

-/// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
digital_root(input, 10)
}
-/// Шестнадесетична бройна система: 0-9, последвано от a-f
pub fn hex(input: &str) -> Option<u32> {
digital_root(input, 16)
}
-/// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
digital_root(input, 8)
}
-/// Двоична бройна система: 0-1
pub fn binary(input: &str) -> Option<u32> {
digital_root(input, 2)
}
fn digital_root(s: &str, radix: u32) -> Option<u32> {
- match to_digital(String::from(s), radix) {
+ match u32::from_str_radix(s, radix).ok() {
None => None,
- Some(num) => u32::from_str_radix(&num, radix).ok()
+ Some(num) => Some(to_digital(num, radix))
}
}
-fn to_digital(s :String, radix: u32) -> Option<String> {
- if s.len() == 0 {
- return None
+fn to_digital(decimal: u32, radix: u32) -> u32 {
+ if decimal < radix {
+ return decimal
}
- if s.len() == 1 {
- return Some(s)
- }
-
- match digits_sum(&s, radix) {
- None => None,
- Some(num) => to_digital(to_radix(num, radix), radix)
- }
+ to_digital(digits_sum(decimal, radix), radix)
}
-fn digits_sum(s: &str, radix: u32) -> Option<u32> {
- s.chars().map(|c| c.to_digit(radix)).sum()
-}
-
-fn to_radix(num: u32, radix: u32) -> String {
- match radix {
- 2 => format!("{:b}", num),
- 8 => format!("{:o}", num),
- 16 => format!("{:x?}", num),
- _ => num.to_string()
+fn digits_sum(num: u32, radix: u32) -> u32 {
+ let mut num = num;
+ let mut sum = 0_u32;
+ while num > 0 {
+ sum = sum + num % radix;
+ num = num / radix;
}
+ sum
}

Стоян качи решение на 03.11.2019 17:44 (преди почти 6 години)

+/// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
digital_root(input, 10)
}
+/// Шестнадесетична бройна система: 0-9, последвано от a-f
pub fn hex(input: &str) -> Option<u32> {
digital_root(input, 16)
}
+/// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
digital_root(input, 8)
}
+/// Двоична бройна система: 0-1
pub fn binary(input: &str) -> Option<u32> {
digital_root(input, 2)
}
fn digital_root(s: &str, radix: u32) -> Option<u32> {
- match u32::from_str_radix(s, radix).ok() {
+ match to_digital(String::from(s), radix) {
None => None,
- Some(num) => Some(to_digital(num, radix))
+ Some(num) => u32::from_str_radix(&num, radix).ok()
}
}
-fn to_digital(decimal: u32, radix: u32) -> u32 {
- if decimal < radix {
- return decimal
+fn to_digital(s :String, radix: u32) -> Option<String> {

Рядко се пише функция, която да приема String, и в случая не виждам добра причина за това. Викаш .len(), което работи и за str, и после го подаваш на функция, която приема &str anyway.

+ if s.len() == 0 {
+ return None
}
- to_digital(digits_sum(decimal, radix), radix)
+ if s.len() == 1 {
+ return Some(s)
+ }
+
+ match digits_sum(&s, radix) {
+ None => None,
+ Some(num) => to_digital(to_radix(num, radix), radix)
+ }
}
-fn digits_sum(num: u32, radix: u32) -> u32 {
- let mut num = num;
- let mut sum = 0_u32;
- while num > 0 {
- sum = sum + num % radix;
- num = num / radix;
+fn digits_sum(s: &str, radix: u32) -> Option<u32> {
+ s.chars().map(|c| c.to_digit(radix)).sum()
+}
+
+fn to_radix(num: u32, radix: u32) -> String {
+ match radix {
+ 2 => format!("{:b}", num),
+ 8 => format!("{:o}", num),
+ 16 => format!("{:x?}", num),
+ _ => num.to_string()
}
- sum
}