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

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

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

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

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 докато пишете.