學習軌道
/
Cairo
Cairo
/
練習
/
歡迎來到科技宮殿!
歡迎來到科技宮殿!

歡迎來到科技宮殿!

學習練習

簡介

Cairo 沒有原生的字串型別,但提供了兩種處理字串的方式:使用單引號的短字串,以及使用雙引號的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」的電器行。 老闆最近裝了一台大型顯示器,用來播放行銷訊息,並在顧客於入口掃描會員卡時顯示特別的問候語。 這台顯示器由許多小 LED 燈組成,可以顯示多行文字。

老闆需要你幫忙處理用來產生新顯示器文字內容的程式碼。

1. 建立歡迎訊息

對大多數掃描會員卡的顧客,老闆希望顯示器顯示 Welcome to the Tech Palace, 後面接著顧客名字的大寫字母。

實作函式 welcome_message,它接受顧客的名字作為短字串(felt252)引數,並回傳所需的訊息作為ByteArray。

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

2. 加上花俏的邊框

對於經常在店裡大量消費的忠實顧客,老闆想在歡迎訊息前後各加一行星星,讓歡迎畫面更花俏。 他們還不確定每行應該要有幾顆星星,所以希望這個數量可以設定。

寫一個函式 add_border,接受一段歡迎訊息(ByteArray)和每行的星星數量(型別u32)作為引數。 它應該回傳一個由 3 行組成的ByteArray:先是一行包含指定數量的星星,接著是原本傳入的歡迎訊息,然後再一行星星。

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

準備好開始 歡迎來到科技宮殿! 了嗎?

註冊 Exercism,透過 25 個概念68 個練習 和真人引導來學習並精通 Cairo,全部免費。