트랙
/
Cairo
Cairo
/
연습 문제
/
테크 팰리스에 오신 것을 환영해요!
테크 팰리스에 오신 것을 환영해요!

테크 팰리스에 오신 것을 환영해요!

학습 연습 문제

소개

Cairo에는 문자열을 위한 자체 타입이 없지만, 문자열을 다루는 두 가지 방법을 제공해요. 작은따옴표를 쓰는 짧은 문자열과 큰따옴표를 쓰는 ByteArray예요.

짧은 문자열은 각 문자가 1바이트로 인코딩되는 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자보다 긴 문자열에는 길이 제한이 없는 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 안의 개별 바이트에 인덱스로 접근할 수도 있어요.

다만 주의할 점은, 반환되는 바이트의 타입이 ByteArray가 아니라 u8이라는 거예요!

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, 와 그 뒤에 대문자로 된 손님의 이름이 표시되기를 원해요.

손님의 이름을 짧은 문자열(felt252) 인자로 받아 원하는 메시지를 ByteArray로 반환하는 welcome_message 함수를 구현해요.

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

2. 멋진 테두리 추가하기

가게에서 많이 구매하는 단골 손님을 위해, 주인은 환영 메시지 앞뒤에 별 한 줄을 넣어 환영 디스플레이를 더 멋지게 만들고 싶어해요. 별이 한 줄에 몇 개 들어가야 할지는 아직 정하지 못했기 때문에, 그 값을 설정할 수 있게 하고 싶어해요.

환영 메시지(ByteArray)와 줄당 별의 개수(u32 타입)를 인자로 받는 add_border 함수를 작성해요. 이 함수는 3줄로 이루어진 ByteArray를 반환해야 해요. 원하는 개수만큼의 별이 있는 줄, 전달받은 그대로의 환영 메시지, 그리고 별이 있는 또 다른 줄 순서예요.

add_border("Welcome!", 10)

다음과 같은 결과를 반환해야 해요:

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

3. 오래된 마케팅 메시지 정리하기

새 디스플레이를 설치하기 전에, 가게에는 설정을 바꿀 수 없는 고정된 줄만 표시할 수 있는 비슷한 디스플레이가 있었어요. 주인은 오래된 마케팅 메시지 일부를 새 디스플레이에서 다시 사용하고 싶어해요. 그런데 그 데이터에는 이미 별 테두리와 불필요한 공백이 포함되어 있어요. 메시지를 다시 사용할 수 있도록 정리해야 해요.

오래된 마케팅 메시지를 ByteArray로 받는 clean_up_message 함수를 구현해요. 이 함수는 먼저 텍스트에서 모든 별을 제거한 다음, 남은 텍스트의 앞뒤 공백을 제거해야 해요. 그다음 정리된 메시지를 반환해야 해요.

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

clean_up_message(message)
// => BUY NOW, SAVE 10%
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Cairo Exercism

테크 팰리스에 오신 것을 환영해요! 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Cairo 트랙을 개념 25개연습 문제 68개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.