Дигитален корен

Предадени решения

Краен срок:
05.11.2019 17:00
Точки:
20

Срокът за предаване на решения е отминал

use solution as digital_root;
#[test]
fn test_decimal_basic() {
assert_eq!(digital_root::decimal("345"), Some(3));
for n in 0..=9 {
assert_eq!(digital_root::decimal(&n.to_string()), Some(n));
}
assert_eq!(digital_root::decimal("10"), Some(1));
}
#[test]
fn test_hex_basic() {
assert_eq!(digital_root::hex("345"), Some(0xc));
assert_eq!(digital_root::hex("7b"), Some(0x3));
for n in 0..=9 {
assert_eq!(digital_root::hex(&n.to_string()), Some(n));
}
assert_eq!(digital_root::hex("a"), Some(0xa));
assert_eq!(digital_root::hex("d"), Some(0xd));
assert_eq!(digital_root::hex("f"), Some(0xf));
assert_eq!(digital_root::hex("10"), Some(0x1));
}
#[test]
fn test_octal_basic() {
assert_eq!(digital_root::octal("345"), Some(0o5));
for n in 0..=7 {
assert_eq!(digital_root::octal(&n.to_string()), Some(n));
}
assert_eq!(digital_root::octal("10"), Some(0o1));
}
#[test]
fn test_binary() {
assert_eq!(digital_root::binary("101"), Some(1));
assert_eq!(digital_root::binary("111"), Some(1));
assert_eq!(digital_root::binary("100"), Some(1));
assert_eq!(digital_root::binary("110"), Some(1));
assert_eq!(digital_root::binary("1100101001010"), Some(1));
}
#[test]
fn test_zeroes() {
assert_eq!(digital_root::decimal("0"), Some(0));
assert_eq!(digital_root::hex("0"), Some(0));
assert_eq!(digital_root::octal("0"), Some(0));
assert_eq!(digital_root::binary("0"), Some(0));
}
#[test]
fn test_invalid() {
assert_eq!(digital_root::decimal("f"), None);
assert_eq!(digital_root::hex("g"), None);
assert_eq!(digital_root::octal("8"), None);
assert_eq!(digital_root::binary("2"), None);
assert_eq!(digital_root::decimal("баба"), None);
assert_eq!(digital_root::hex("баба"), None);
assert_eq!(digital_root::octal("баба"), None);
assert_eq!(digital_root::binary("баба"), None);
}

Digital root

Дигиталния корен на едно число може да получим като съберем цифрите му, после съберем цифрите на резултата му и така нататък, докато получим една-единствена цифра. Примерно, за числото 345:

3 + 4 + 5 = 12
1 + 2 = 3

И така, дигиталния корен на 345 е цифрата 3. Или поне в десетична бройна система. В шестнадесетична, дигиталния корен би бил c. Друг пример в шестнадесетична система, 7b:

7 + b = 12 (7 + 11 = 18 в десетични сметки)
1 + 2 = 3

Корена на 7b е 3, поне в тази бройна система.

Искаме от вас да имплементирате няколко функции, които да изчислят дигиталния корен в конкретни бройни системи. Нужно е да се справяте само с неотрицателни числа. Входа е низ, който бива интерпретиран като число в съответната бройна система. Изхода е число (опаковано в Option), което би трябвало да е една "цифра" в тази бройна система.

Ако подадем низ, който е невалиден за дадената бройна система, очакваме функциите да върнат None. Забележете, че функциите, които ще използвате в стандартната библиотека вероятно ще връщат или Option, или Result в ситуации, в които входа е невалиден. Типа Result може да се превърне в Option чрез метода .ok().

Някои неща, за които не е нужно да се тревожите твърде много:

  • Няма да подаваме низове, чиято сума на цифрите да надхвърли капацитета на u32.
  • Няма да подаваме празни низове или низове с интервали или специални символи (низовете тук са просто механизъм за опростяване на входа).
  • Няма да подаваме низове, започващи с +, въпреки, че са валидни неотрицателни числа.
  • За низовете в шестнадесетична бройна система, ще подаваме само малки букви, тоест "7b" но не "7B".

(Ако смятате, че това ви улеснява твърде много -- първо домашно е, следващите ще бъдат по-трудни :). Но сте свободни да имплементирате каквато искате логика за тези странични случаи и да си напишете тестове, ако искате, стига да не счупите някой друг case.)

Свободни сте да имплементирате каквито искате помощни функции, ако ви трябват. Публичните функции трябва да имат този интерфейс:

/// Десетична бройна система: 0-9
pub fn decimal(input: &str) -> Option<u32> {
    unimplemented!()
}

/// Шестнадесетична бройна система: 0-9, последвано от a-f
pub fn hex(input: &str) -> Option<u32> {
    unimplemented!()
}

/// Осмична бройна система: 0-7
pub fn octal(input: &str) -> Option<u32> {
    unimplemented!()
}

/// Двоична бройна система: 0-1
pub fn binary(input: &str) -> Option<u32> {
    unimplemented!()
}

Внимавайте всички типове и методи, които ни трябват, да бъдат маркирани като pub, за да могат тестовете ни да ги викат (както сме сложили в шаблона). Бъдете сигурни, че кода ви се компилира заедно с базовия тест, но не разчитайте, че базовия тест ще ви хване бъговете.

Разгледайте документацията на char и на u32 и вероятно ще намерите полезни функции и методи които да ви улеснят живота.

Прочетете и общия guide за писане на домашни. И си пуснете подходящ soundtrack докато пишете.

Задължително прочетете (или си припомнете): Указания за предаване на домашни