轨道
/
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,全部免费。