Треки
/
Crystal
Crystal
/
Вправи
/
Бібліотека Лутона
Бібліотека Лутона

Бібліотека Лутона

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

Вступ

Char - це тип даних у Crystal, що представляє 32-бітну кодову точку Unicode. Його розмір робить його економним щодо памʼяті та надає йому особливих властивостей, яких не мають рядки тексту (англ. string). Такі значення створюють за допомогою одинарних лапок ('), і всередину можна помістити лише одну кодову точку Unicode.

'a' # => 'a'
'a'.class # => Char

У Crystal досить часто доводиться працювати з Char, коли ми працюємо з рядками тексту, адже чимало методів класу String повертають Char або приймають Char як аргументи. Наприклад, метод String#[] повертає Char, а метод String#chars повертає колекцію Char.

Інкремент і декремент

Оскільки Char є 32-бітною кодовою точкою Unicode, він підтримує інкремент і декремент: якщо у нас є 'a', то, додавши одиницю, ми отримаємо 'b'.

'a' + 5
# => 'f'

'z' - 25
# => 'a'

Також є метод Char#succ, який повертає наступний символ у таблиці Unicode, і Char#pred, який повертає попередній символ у таблиці Unicode.

'a'.succ
# => 'b'

'z'.pred
# => 'y'

Конкатенація

Оскільки Char призначений лише для представлення 32-бітної кодової точки Unicode, два символи не можна конкатенувати. Тому Char можна конкатенувати лише з рядками тексту.

'a' + "bc"
# => "abc"

'a' + 'b'
# => error: expected argument #1 to 'Char#+' to be Int or String, not Char

Методи властивостей

У Crystal є кілька методів, які дають змогу дізнатися більше про символ: наприклад, чи є він числом або літерою, чи написаний у верхньому чи нижньому регістрі. Ось список деяких із цих методів; повний список дивіться в API Char:

Метод Опис
Char#number? Повертає true, якщо символ є числом
Char#letter? Повертає true, якщо символ є літерою
Char#lowercase? Повертає true, якщо символ у нижньому регістрі
Char#uppercase? Повертає true, якщо символ у верхньому регістрі
Char#ascii? Повертає true, якщо символ належить до ASCII
Char#whitespace? Повертає true, якщо символ є пробільним

Перетворення

Перетворення між кодовими точками та Char

Оскільки Char представляє 32-бітну кодову точку Unicode, ми можемо перетворювати Char у кодові точки (Int) і навпаки. Для цього використовують метод Char#ord, який повертає кодову точку символу, або метод Int#chr, який повертає символ за його кодовою точкою.

'a'.ord
# => 97

97.chr
# => 'a'

Перетворення між типами

Як і в інших типів даних, у символів є кілька методів для перетворення між типами. Найпоширеніший із них - метод Char#to_s, який перетворює символ у рядок тексту. Крім того, є метод Char#to_i, який перетворює символ у Int, і метод Char#to_f, який перетворює символ у Float.

'a'.to_s
# => "a"

'4'.to_i
# => 4

'a'.to_i
# => Error: Invalid integer: a (ArgumentError)

Вказівки

Бібліотека Лутона - велика бібліотека з великою колекцією літератури, від книжок до мистецтва. У бібліотеці є відділ, де вивчають літературу та додають книжки до компʼютерної системи.

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

1. Отримати першу літеру назви

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

Реалізуйте метод Library.first_letter, який приймає аргумент title, що містить назву книги. Метод має повертати першу літеру назви.

Library.first_letter("Mystery of the Crystal Skull")
# => 'M'

2. Отримати ініціали авторів

У бібліотеці багато книжок, написаних різними авторами. Авторів часто називають за ініціалами, тож бібліотека попросила систему, яка за введеними імʼям та прізвищем видає ініціали автора. Ініціали мають бути відформатовані так: {first_letter_of_first_name}.{first_letter_of_last_name}

Реалізуйте метод Library.initials, який приймає два аргументи first_name і last_name, що містять імʼя та прізвище автора. Метод має повертати ініціали автора.

Library.initials("William", "Shakespeare")
# => "W.S"

3. Розшифрувати літеру

Деяка література зашифрована, і в бібліотеці багато зашифрованих текстів. Бібліотека хотіла б отримати нову систему розшифрування для особливого шифрування.

Шифрування працює так: беруть літеру й замінюють її на літеру, що стоїть перед нею в алфавіті. Наприклад, a стає z, b стає a, c стає b і так далі.

Бібліотека хотіла б, щоб система могла розшифровувати як великі, так і малі літери й зберігати той самий регістр, що й у вихідної літери.

Реалізуйте метод Library.decrypt_character, який приймає аргумент character, що містить літеру для розшифрування. Метод має повертати розшифровану літеру.

Library.decrypt_character('a')
# => 'z'

4. Розшифрувати текст

Бібліотека також хотіла б розшифровувати цілий текст за допомогою шифрування, яке бере попередню літеру в алфавіті.

Розшифрувальник має розшифровувати лише літери, а всі інші символи залишати без змін.

Реалізуйте метод Library.decrypt_text, який приймає аргумент text, що містить текст для розшифрування. Метод має повертати розшифрований текст.

Library.decrypt_text("Ifmmp Xpsme!")
# => "Hello World!"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Crystal Exercism

Час розпочати Бібліотека Лутона?

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