Треки
/
Crystal
Crystal
/
Вправи
/
Робот для вечірки
Робот для вечірки

Робот для вечірки

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

Вступ

У Crystal є тип String, який використовують для представлення тексту. Рядки тексту (англ. string) у Crystal - це послідовності символів Unicode. Рядки тексту незмінні: після створення їх уже не можна змінити. Тому щоразу, коли ми змінюємо рядок тексту, створюється новий рядок, а початковий залишається без змін.

Щоб визначити рядок тексту, використовують подвійні лапки ".

"Hello World"

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

Щоб зʼєднати два рядки тексту, використаймо оператор +. Оператор + повертає новий рядок тексту, який поєднує ці два рядки.

hello = "Hello"
hello + " World"
# => "Hello World"

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

Метод to_i перетворює рядок тексту на ціле число. Натомість метод to_f повертає число з плаваючою комою. Якщо рядок тексту не вдається перетворити на число, буде викликано помилку ArgumentError.

"1".to_i
# => 1

"1.0".to_f
# => 1.0

"Hello".to_i
# => ArgumentError: Invalid integer: Hello

Ціле число або число з плаваючою комою можна перетворити на рядок тексту методом to_s.

1.to_s
# => "1"

1.0.to_s
# => "1.0"

Інтерполяція

Інтерполяція - це зручний спосіб поєднувати рядки тексту й вбудовувати вирази в рядки. Щоб інтерполювати рядок тексту, використаймо символ #, за яким ідуть фігурні дужки {} із виразом усередині.

name = "World"
"Hello #{name}!"
# => "Hello World!"

Crystal автоматично перетворить результат виразу на рядок тексту.

"Hello #{1 + 1}!"
# => "Hello 2!"

Розмір

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

"Hello World".size
# => 11

Індексація

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

Note

[] реалізовано як метод екземпляра String, де індекс є аргументом методу.

Перший символ у рядку тексту в Crystal має індекс 0.

"Hello World"[0]
# => 'H'

"Hello World"[6]
# => 'W'

Щоб дістати символ із кінця рядка тексту, можна взяти довжину рядка мінус один, і це буде індекс останнього символу; для передостаннього символу - довжину мінус два, і так далі. Є й коротший шлях: скористатися відʼємним індексом, де останній символ має індекс -1, передостанній - індекс -2, і так далі.

name = "Hello World"
name[name.size - 1]
# => 'd'

name[-1]
# => 'd'

Екранування

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

Ось спеціальні символи в Crystal:

Значення Опис
\a Сигнал
\b Крок назад
\e Керуючий символ
\f Подача сторінки
\n Переведення рядка або новий рядок
\r Повернення каретки
\t Горизонтальна табуляція
\v Вертикальна табуляція
\\ Зворотна коса риска
\' Одинарні лапки
\" Подвійні лапки
\377 Вісімковий символ ASCII
\xFF Шістнадцятковий символ ASCII
\uFFFF Шістнадцятковий символ Unicode
puts "Hello \"World\""
# => Hello "World"

puts "Hello \nWorld"
# => Hello
# => World

Багаторядкові рядки тексту

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

"Hello
World"
# => "Hello\nWorld"

Вказівки

Жив собі ексцентричний програміст у дивному будинку з ґратами на вікнах. Одного дня він узяв на онлайн-біржі праці замовлення: створити робота для вечірок. Робот має вітати людей і проводжати їх до їхніх місць. Перша версія була дуже технічною і виказувала брак навичок спілкування в програміста. Дещо з цього також перейшло в наступну версію.

1. Привітати нового гостя на вечірці

Реалізуймо метод welcome, який повертає вітальне повідомлення з переданим імʼям:

PartyRobot.welcome("Christiane")
# => Welcome to my party, Christiane!

2. Привітати нового гостя, у якого сьогодні день народження

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

PartyRobot.happy_birthday("Frank", 58)
# => Happy birthday Frank! You are now 58 years old!

3. Вказати напрямок

Реалізуймо функцію assign_table, яка вказує напрямок. Вона має приймати 5 параметрів.

  • Імʼя нового гостя, якого треба привітати (String)
  • Номер столика (Int)
  • Імʼя сусіда, що сидітиме поруч (String)
  • Напрямок, у якому шукати столик (String)
  • Відстань до столика (Float64)

Точний формат результату видно в прикладі нижче.

Імʼя сусіда потрібно скоротити до першої та останньої літери. Frank стає Fk, Christian стає Cn і так далі.

Робот називає номер столика. Робот також згадує відстань до столика. На щастя, лише з точністю до однієї цифри.

PartyRobot.assign_table("Christiane", "on the left", 27, 23.7834298, "Frank")
# =>
# Welcome to my party, Christiane!
# You have been assigned to table 27. Your table is on the left, exactly 23.8 meters from here.
# You will be sitting next to Fk.
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Crystal Exercism

Час розпочати Робот для вечірки?

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