Треки
/
Haskell
Haskell
/
Вправи
/
Тріо кольорів резистора
Тріо кольорів резистора

Тріо кольорів резистора

Легка

Вказівки

Якщо ми хочемо щось зібрати на Raspberry Pi, то, найімовірніше, використаємо резистори. Для цієї вправи про них потрібно знати лише три речі:

  • Кожен резистор має значення опору.

  • Резистори маленькі, настільки маленькі, що якби на них надрукували значення опору, його було б важко прочитати. Щоб обійти цю проблему, виробники наносять на резистори кольорові смуги, які позначають їхній опір.

  • Кожна смуга позначає цифру числа. Наприклад, якби вони надрукували смугу brown (значення 1), а за нею смугу green (значення 5), це відповідало б числу 15. У цій вправі ми створимо корисну програму, щоб нам не доводилося запамʼятовувати значення смуг. Програма прийматиме 3 кольори як вхідні дані й видаватиме правильне значення в омах. Кольорові смуги кодуються так:

  • black: 0

  • brown: 1

  • red: 2

  • orange: 3

  • yellow: 4

  • green: 5

  • blue: 6

  • violet: 7

  • grey: 8

  • white: 9

У вправі Resistor Color Duo ми розшифрували перші два кольори. Наприклад: orange-orange дає основне значення 33. Третій колір показує, скільки нулів потрібно додати до основного значення. Основне значення плюс нулі дає значення в омах. Для цієї вправи не має значення, чим насправді є оми. Наприклад:

  • orange-orange-black дає 33 і жодного нуля, тобто 33 ohms.
  • orange-orange-red дає 33 і 2 нулі, тобто 3300 ohms.
  • orange-orange-orange дає 33 і 3 нулі, тобто 33000 ohms.

(Якщо математика нам до вподоби, можемо уявити нулі як степені десяти. Якщо ні, просто працюймо з нулями. Насправді це те саме, лише простою мовою, а не математичним жаргоном.)

Ця вправа полягає в тому, щоб перетворити кольори на мітку:

"... ohms"

Тож вхід "orange", "orange", "black" має повернути:

"33 ohms"

Коли йдеться про більші резистори, для позначення більшої величини опору використовують метричний префікс, наприклад «kiloohms». Це схоже на «2 кілометри» замість «2000 метрів» або «2 кілограми» замість «2000 грамів».

Наприклад, вхід "orange", "orange", "orange" має повернути:

"33 kiloohms"

Підказки

Потрібно реалізувати функції label і ohms. Можна скористатися наданою сигнатурою для label, але хай вона не обмежує творчість.

Ця вправа працює з текстовими даними. З історичних причин тип String у Haskell є синонімом до [Char], масиву символів. Для ефективнішої роботи з текстовими даними можна використати тип Text.

Як необовʼязкове розширення до цієї вправи, можна:

  • Прочитати про типи рядків тексту (англ. string) у Haskell.

  • Додати - text до списку залежностей у package.yaml.

  • Імпортувати Data.Text у такий спосіб:

    import qualified Data.Text as T
    import           Data.Text (Text)
    
  • Тепер можна написати, наприклад, label :: Resistor -> Text і звертатися до комбінаторів Data.Text як, наприклад, T.pack.

  • Знайти документацію для Data.Text,

Ця частина цілком необовʼязкова.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Haskell Exercism

Час розпочати Тріо кольорів резистора?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Haskell, а також 107 вправ та справжнє наставництво від людей, і все це безкоштовно.