Треки
/
Cairo
Cairo
/
Вправи
/
Ласкаво просимо до Tech Palace!
Ласкаво просимо до Tech Palace!

Ласкаво просимо до Tech Palace!

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

Вступ

У Cairo немає вбудованого типу для рядків тексту (англ. string), але є два способи працювати з ними: короткі рядки в одинарних лапках і ByteArray у подвійних.

Короткий рядок - це ASCII-рядок, у якому кожен символ закодовано одним байтом.

Тип, який Cairo типово використовує для коротких рядків, - це felt252, тож їхня максимальна довжина становить лише 31 символ.

// below are different ways to write the same value
let name: felt252 = 'Jane';     // short string format
let name: felt252 = 0x4a616e65; // byte format
let name: felt252 = 1247899237; // decimal format

Формально кажучи, будь-який цілий тип, менший за felt252, можна подати у форматі короткого рядка.

// all of the below are equal u8 values, they are just written using different formats!
let lowercase_a_in_ascii: u8 = 'a';  // short string format
let lowercase_a_in_ascii: u8 = 0x61; // byte format
let lowercase_a_in_ascii: u8 = 97;   // decimal format

Для рядків, довших за 31 символ, Cairo надає ByteArray, довжина якого необмежена.

let long_string: ByteArray = "this is a string which has more than 31 characters";

ByteArray можна зʼєднувати за допомогою оператора +:

"Jane" + " " + "Austen"
// => "Jane Austen"

Деякі спеціальні символи потрібно екранувати за допомогою зворотної скісної риски, наприклад \t для символу табуляції та \n для переходу на новий рядок.

"How is the weather today?\nIt's sunny"  
// =>
// How is the weather today?
// It's sunny

Можна навіть отримати доступ до окремих байтів усередині ByteArray за його індексом.

Але будьмо уважні: тип поверненого байта - це u8, а не ByteArray!

let hello: ByteArray = "Hello World!";
let exclamation_mark: u8 = hello[11];
// => 33

Основна бібліотека надає багато корисних методів і операторів для роботи з ByteArray.

Щоб дізнатися більше про методи ByteArray, перегляньте документацію ByteArrayTrait.

Ось кілька прикладів:

let name: felt252 = 'Jane';
let mut greeting: ByteArray = "Welcome ";

// append_word appends a single word of a given number of bytes to the end of the ByteArray 
greeting.append_word(name, 4);
// => "Welcome Jane"

// rev returns a ByteArray with the all characters reversed
let rev_greeting = greeting.rev();
// => "enaJ emocleW"

Вказівки

Недалеко є магазин побутової техніки під назвою «Tech Palace». Власник магазину нещодавно встановив великий дисплей, щоб показувати рекламні повідомлення та особливе вітання, коли покупці сканують свої картки лояльності біля входу. Дисплей складається з безлічі дрібних світлодіодів і може показувати кілька рядків тексту.

Власникові магазину потрібна наша допомога з кодом, який генерує текст для нового дисплея.

1. Створіть вітальне повідомлення

Для більшості покупців, які сканують свої картки лояльності, власник хоче бачити на дисплеї Welcome to the Tech Palace, , за яким іде імʼя покупця великими літерами.

Реалізуйте функцію welcome_message, яка приймає імʼя покупця як короткий рядок тексту (англ. string) в аргументі типу felt252 і повертає потрібне повідомлення як ByteArray.

welcome_message("Judy")
// => Welcome to the Tech Palace, JUDY

2. Додайте декоративну рамку

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

Напишіть функцію add_border, яка приймає вітальне повідомлення (типу ByteArray) і кількість зірочок у рядку (тип u32) як аргументи. Вона має повернути ByteArray, що складається з 3 рядків: рядка з потрібною кількістю зірочок, потім вітального повідомлення в тому вигляді, у якому його передали, і ще одного рядка зірочок.

add_border("Welcome!", 10)

Має повернути таке:

**********
Welcome!
**********

3. Приберіть старі рекламні повідомлення

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

Реалізуйте функцію clean_up_message, яка приймає старе рекламне повідомлення як ByteArray. Спочатку функція має прибрати з тексту всі зірочки, а потім прибрати пробільні символи на початку й у кінці того, що залишилося. Після цього функція має повернути очищене повідомлення.

let message: ByteArray = "
**************************
*    BUY NOW, SAVE 10%   *
**************************
";

clean_up_message(message)
// => BUY NOW, SAVE 10%
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Cairo Exercism

Час розпочати Ласкаво просимо до Tech Palace!?

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