Trilhas
/
Cairo
Cairo
/
Exercícios
/
Mago em treinamento
Mago em treinamento

Mago em treinamento

Exercício de aprendizagem

Introdução

Arrays

A biblioteca padrão do Cairo implementa um tipo Array.

Ele é parecido com os tipos de array comuns em outras linguagens de programação, mas com algumas diferenças importantes:

  • Os elementos só podem ser adicionados com eficiência no final do tipo Array, e só podem ser removidos com eficiência do início.
  • É impossível definir um item manualmente usando o índice do array.

Arrays podem ser criados com a função ArrayTrait::new e também com a macro array!:

let empty: Array<u32> = ArrayTrait::new();
let one_to_four = array![1, 2, 3, 4];

Elementos podem ser adicionados ao array com a função ArrayTrait::append:

let mut num_array = array![1, 2, 3, 4];
num_array.append(5);
// -> [1, 2, 3, 4, 5]

Elementos podem ser removidos do array com a função ArrayTrait::pop_front:

let mut one_to_four = array![1, 2, 3, 4];

one_to_four.pop_front();
// -> [2, 3, 4]

O Cairo também introduz um tipo Span, que funciona como um "snapshot" do Array.

Todo Array pode ser convertido em um Span com a função ToSpanTrait::span:

let one_to_four = array![1, 2, 3, 4];
let one_to_four_span = one_to_four.span();
// -> [1, 2, 3, 4]

Converter um array em um Span é muito eficiente, porque Span é apenas uma estrutura de dados que permite ao Cairo "ver" uma seção do array. Ele não modifica o array de forma alguma.

Ao converter um array em um Span, o Cairo permite realizar mais operações do que seria permitido diretamente em Array, como remover um item do início do span.

let one_to_four = array![1, 2, 3, 4];
let mut one_to_four_span = one_to_four.span();
one_to_four_span.pop_back();
// -> [2, 3, 4]

Repare que tivemos que tornar one_to_four_span mutável com a palavra-chave mut para chamar pop_back, que modifica o span encurtando a seção do array que o span está "vendo".

Instruções

Como aprendiz de mágica, Elyse precisa praticar o básico.

Ela tem uma pilha de cartas que quer manipular.

Para facilitar um pouco as coisas, ela usa apenas as cartas de 1 a 10.

A pilha de cartas é representada por um Array, com a base da pilha na frente do array e o topo da pilha no final.

1. Inserir uma carta no topo da pilha

Implemente a função insert_top que retorna uma cópia da pilha com a nova carta informada adicionada ao topo da pilha.

let stack = array![5, 9, 7, 1];
insert_top(stack, 8);
// -> [5, 9, 7, 1, 8]

2. Remover a carta do topo da pilha

Implemente a função remove_top_card que retorna uma cópia da pilha com a carta do topo removida.

Se a pilha informada estiver vazia, a pilha original deve ser retornada, sem alterações.

let stack = array![3, 2, 6, 4, 8];
remove_top_card(stack);
// -> [3, 2, 6, 4]

3. Inserir uma carta na base da pilha

Implemente a função insert_bottom que retorna uma cópia da pilha com a nova carta informada adicionada à base da pilha.

let stack = array![5, 9, 7, 1];
insert_bottom(stack, 8);
// -> [8, 5, 9, 7, 1]

4. Remover uma carta da base da pilha

Implemente a função remove_bottom_card que retorna uma cópia da pilha com a carta da base removida.

Se a pilha informada estiver vazia, a pilha original deve ser retornada, sem alterações.

let stack = array![8, 5, 9, 7, 1];
remove_bottom_card(stack);
// -> [5, 9, 7, 1]

5. Verificar o tamanho da pilha

Implemente a função check_size_of_stack que verifica se o tamanho da pilha é igual a um stack_size informado ou não.

let stack = array![3, 2, 6, 4, 8];
check_size_of_stack(stack, 4);
// -> false

Para entender por que trabalhar com arrays em Cairo não é tão simples quanto em outras linguagens de programação, é bom ter em mente que Cairo usa um modelo de memória imutável. Ou seja, depois que uma célula de memória recebe um valor, ela nunca mais pode ser sobrescrita, apenas lida.

A linguagem abstrai um pouco essa característica, permitindo que quem programa declare e use suas variáveis como se fossem mutáveis.

Embora isso torne a escrita de código um pouco mais desafiadora, especialmente de código que usa o tipo Array (incluindo ByteArray, que por baixo é um "array de bytes"), ela permite escrever programas demonstráveis, que podem ser executados com confiança até em máquinas não confiáveis, o que faz essa troca valer muito a pena.

Editar via GitHub O link abre em uma nova janela ou aba
Cairo Exercism

Tudo pronto para começar Mago em treinamento?

Crie sua conta no Exercism para aprender e dominar Cairo com 25 conceitos68 exercícios e mentoria humana de verdade, tudo de graça.