Треки
/
Crystal
Crystal
/
Вправи
/
Фотофузіоніст
Фотофузіоніст

Фотофузіоніст

Навчальна вправа

Вступ

Двійкова, вісімкова та шістнадцяткова (також відома як hex) - це різні системи числення з різними основами. Двійкова має основу 2, вісімкова - основу 8, а шістнадцяткова - основу 16. Звичайні цілі числа в Crystal мають основу 10. Двійкова, вісімкова та шістнадцяткова системи є представленнями цілих чисел. Це означає, що вони представляють додатні та відʼємні числа (включно з нулем) без дробів чи десяткових частин і підтримують усі операції, які ми можемо виконувати з цілими числами.

Двійкова система

Двійкова система - це система числення з основою 2, яка використовує лише цифри 0 та 1. Вона зазвичай представляє стани 0 («вимкнено») та 1 («увімкнено») проходження електричного струму через транзистори та перемикачі в компʼютерах, а також додатні та відʼємні заряди в магнітних носіях інформації. Двійкова система може представити всі цілі числа, які використовуються в системі з основою 10.

Фрагмент системи з основою 2 має такий вигляд, хоча вона продовжується нескінченно й не зупиняється на 128:

128 64 32 16 8 4 2 1
2 ** 7 2 ** 6 2 ** 5 2 ** 4 2 ** 3 2 ** 2 2 ** 1 2 ** 0

Отже, якщо ми хочемо представити число 6, у двійковій системі воно буде таким: 110

Значення розряду 4 2 1
Двійкове число 1 1 0

А операція буде такою: 4 + 2 + 0 = 6

Ще один приклад: 19

Значення розряду 16 8 4 2 1
Двійкове число 1 0 0 1 1

Двійкове число буде таким: 10011 А операція буде такою: 16 + 0 + 0 + 2 + 1 = 19

Двійкова система в Crystal

У Crystal ми можемо записувати двійкові літерали за допомогою префікса 0b. Якщо ми напишемо 0b10011, Crystal інтерпретує його як двійкове число й перетворить його на число з основою 10.

0b10011
# => 19

typeof(0b10011)
# => Int32

Якщо написати число з префіксом 0b, яке не є двійковим, це спричинить помилку компіляції.

0b10211
# => Error: unexpected token: "211"

Операції з двійковими числами

Оскільки двійкові числа є цілими, ми можемо виконувати з ними всі операції, доступні для цілих чисел.

0b10011 + 0b10011
# => 38

0b10011 * 0b10011
# => 361

0b10011 / 3
# => 6.333333333333333

Перетворення до двійкового представлення та з нього

Crystal автоматично перетворює двійковий літерал на Int32. Щоб перетворити Int32 на двійкове представлення, використаймо метод <int>.to_s(base) з аргументом base, рівним 2. Метод поверне рядок тексту (англ. string) з представленням двійкового числа:

19.to_s(2)
# => "10011"

Щоб перетворити рядок тексту з двійковим представленням на ціле число, ми можемо використати метод <int>.to_i(base), передавши основу (2) як аргумент:

"10011".to_i(2)
# => 19

Якщо вказати неправильну основу (або некоректне двійкове представлення), це спричинить ArgumentError:

"011021".to_i(2)
# => Invalid Int32: "011021" (ArgumentError)

Методи для двійкових чисел

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

<int>.bit_length повертає кількість бітів, потрібних для представлення числа:

19.bit_length
# => 5

<int>.bit(index) повертає біт за вказаним індексом, починаючи справа (наймолодший біт):

19.bit(0)
# => 1

0b10011.bit(1)
# => 1

Вісімкова система

Вісімкова система - це система числення з основою 8. Вона використовує цифри 0, 1, 2, 3, 4, 5, 6 та 7.

У Crystal ми можемо записувати вісімкові числа за допомогою префікса 0o. Як і у випадку з двійковою системою, Crystal автоматично перетворює вісімкове представлення на Int32.

0o123
# => 83

Якщо додати префікс 0o до числа, яке не є вісімковим, це спричинить помилку компіляції.

Перетворення до вісімкового представлення та з нього

Як і у випадку з двійковою системою, ми можемо використати метод <int>.to_s(base), щоб перетворити Int32 на вісімкове представлення. А метод <int>.to_i(base) дозволяє перетворити вісімкове представлення на Int32.

83.to_s(8)
# => "123"

"123".to_i(8)
# => 83

Як і у випадку з двійковою системою, неправильна основа спричинить ArgumentError.

Шістнадцяткова система

Шістнадцяткова система - це система числення з основою 16. Вона використовує цифри 0 - 9 та літери A, B, C, D, E і F. A дорівнює 10, B - 11, C - 12, D - 13, E - 14, а F - 15.

Ми можемо записувати шістнадцяткові числа в Crystal за допомогою префікса 0x. Як і у випадку з двійковою та вісімковою системами, Crystal автоматично перетворює шістнадцяткові літерали на Int32.

#=> 0x123
291

Якщо додати префікс 0x до числа, яке не є шістнадцятковим, це спричинить помилку компіляції.

Перетворення до шістнадцяткового представлення та з нього

Як і у випадку з двійковою системою, ми можемо використати метод <int>.to_s(base), щоб перетворити Int32 на шістнадцяткове представлення. А метод <int>.to_i(base) дозволяє перетворити шістнадцяткове представлення на Int32.

291.to_s(16)
# => "123"

"123".to_i(16)
# => 291

Як і у випадку з двійковою та вісімковою системами, неправильна основа спричинить ArgumentError.

Точність

Під час перетворення числа на рядок тексту ми можемо вказати точність числа. Тобто мінімальну кількість цифр, потрібних для представлення числа. Якщо число має менше цифр, ніж задана точність, до рядка тексту додаються провідні нулі. Це робиться шляхом передавання аргументу precision у метод <int>.to_s(<base>, precision: <value>).

291.to_s(16, precision: 5)
# => "00123"

543.to_s(precision: 2)
# => "543"

Вказівки

Ваш друг втомився платити за програму для редагування фото і вирішив написати власну. Ваш друг вирішив назвати нову програму Foto Fusionist.

Foto Fusionist - це програма для редагування фото, яка вміє багато чого, але поки що ми реалізували лише кілька з цих можливостей. Утім, ваш друг дуже задоволений прогресом і попросив реалізувати ще кілька можливостей.

1. Перетворити двійкове представлення на ціле число

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

Реалізуйте метод FotoFusionist.binary_to_int, який приймає аргумент binary типу String. Метод має повернути цілочисельне представлення двійкового числа.

FotoFusionist.binary_to_int("10011")
# => 19

2. Отримати найменш значущий біт із цілого числа

Друга можливість, яку хоче ваш друг, - це вміти отримувати найменш значущий біт із цілого числа. Найменш значущий біт - це біт, який розташований найдалі праворуч. Його називають найменш значущим бітом, бо він має найменше значення.

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

Реалізуйте метод FotoFusionist.least_significant_bit, який приймає аргумент number типу Int32. Метод має повернути найменш значущий біт числа.

FotoFusionist.least_significant_bit(0b10011)
# => 1

FotoFusionist.least_significant_bit(0b10010)
# => 0

3. Отримати шістнадцяткове значення з каналу кольору

Третя можливість, яку хоче ваш друг, - це вміти отримувати шістнадцяткове значення з каналу кольору. Шістнадцяткове значення потрібне, щоб перетворити канал кольору на шістнадцяткове представлення, а отримане шістнадцяткове представлення має складатися з двох цифр.

Реалізуйте метод FotoFusionist.hex_value, який приймає аргумент number типу Int32. Метод має повернути шістнадцяткове значення числа як String.

FotoFusionist.hex_value(19)
# => "13"

4. Отримати шістнадцяткове значення з RGB

Четверта можливість, яку хоче ваш друг, - це вміти отримувати шістнадцяткове значення з кольору RGB. Це потрібно, щоб користувач міг отримати єдине представлення кольору у вигляді рядка тексту (англ. string). Колір RGB - це колір, представлений трьома каналами кольору: червоним, зеленим і синім. Кожен канал кольору представлений числом від 0 до 255.

Шістнадцяткове значення кольору RGB - це представлення кольору в шістнадцятковій системі у вигляді рядка тексту, де спочатку йде червоний канал кольору, потім зелений, а наприкінці синій.

Реалізуйте метод FotoFusionist.hex_value_from_rgb, який приймає три аргументи: red, green і blue типу Int32. Метод має повернути шістнадцяткове значення кольору RGB як String.

FotoFusionist.hex_value_from_rgb(255, 0, 0)
# => "ff0000"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Crystal Exercism

Час розпочати Фотофузіоніст?

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