Trilhas
/
Crystal
Crystal
/
Exercícios
/
Biblioteca de Luton
Biblioteca de Luton

Biblioteca de Luton

Exercício de aprendizagem

Introdução

Char é um tipo de dados em Crystal que representa um code point Unicode de 32 bits. O tamanho deles os torna eficientes em memória e lhes dá propriedades específicas que as strings não têm. Eles são criados com aspas simples (') e permitem colocar apenas um code point Unicode dentro.

'a' # => 'a'
'a'.class # => Char

É bem comum trabalhar com Chars ao lidar com strings em Crystal, já que vários métodos da classe String retornam Chars ou recebem Chars como argumentos. Por exemplo, o método String#[] retorna um Char, e o método String#chars retorna uma coleção de Chars.

Incremento / decremento

Como um Char é um code point Unicode de 32 bits, ele permite incremento e decremento. Isso faz com que, se você tem 'a', possa obter 'b' somando um.

'a' + 5
# => 'f'

'z' - 25
# => 'a'

Existe também um método chamado Char#succ, que retorna o próximo char na tabela Unicode, e o Char#pred, que retorna o char anterior na tabela Unicode.

'a'.succ
# => 'b'

'z'.pred
# => 'y'

Concatenação

Como um Char só serve para representar um code point Unicode de 32 bits, dois chars não podem ser concatenados. Por isso, só dá para concatenar Chars com strings.

'a' + "bc"
# => "abc"

'a' + 'b'
# => error: expected argument #1 to 'Char#+' to be Int or String, not Char

Métodos de propriedades

O Crystal tem alguns métodos para obter informações sobre um caractere, como saber se ele é um número ou uma letra, ou se é maiúsculo ou minúsculo. Veja uma lista de alguns desses métodos; para a lista completa, consulte a API do Char:

Método Descrição
Char#number? Retorna true se o Char for um número
Char#letter? Retorna true se o Char for uma letra
Char#lowercase? Retorna true se o Char for minúsculo
Char#uppercase? Retorna true se o Char for maiúsculo
Char#ascii? Retorna true se o Char for um caractere ASCII
Char#whitespace? Retorna true se o Char for um caractere de espaço em branco

Conversão

Conversão entre code points e Chars

Como um Char é um code point Unicode de 32 bits, é possível converter entre Chars e code points (Int). Isso pode ser feito com o método Char#ord, que retorna o code point do Char, ou com o método Int#chr, que retorna o Char do code point.

'a'.ord
# => 97

97.chr
# => 'a'

Conversão entre tipos

Assim como os outros tipos de dados, os chars têm alguns métodos para converter entre tipos. O mais comum é o método Char#to_s, que converte o Char em uma string. No entanto, também existem o método Char#to_i, que converte o Char em um Int, e o método Char#to_f, que converte o Char em um Float.

'a'.to_s
# => "a"

'4'.to_i
# => 4

'a'.to_i
# => Error: Invalid integer: a (ArgumentError)

Instruções

A biblioteca de Luton é uma grande biblioteca com uma vasta coleção de literatura, que vai de livros a arte. A biblioteca tem uma seção onde se estuda literatura e se adicionam livros ao sistema do computador.

Algumas partes pretendem ser automatizadas e pediram sua ajuda. Isso inclui ajudar desde a automação dos formulários do processo de inscrição até ajudar a descriptografar textos.

1. Obter a primeira letra do título

Os livros de uma biblioteca devem ser fáceis de encontrar, então são ordenados pela primeira letra do título.

Implemente o método Library.first_letter, que recebe um argumento title, que contém o título do livro. O método deve retornar a primeira letra do título.

Library.first_letter("Mystery of the Crystal Skull")
# => 'M'

2. Obter as iniciais do autor

A biblioteca tem muitos livros escritos por autores diferentes. Muitas vezes os autores são chamados pelas iniciais, então a biblioteca pediu um sistema que forneça as iniciais do autor a partir do primeiro nome e do sobrenome informados. As iniciais devem ser formatadas assim: {first_letter_of_first_name}.{first_letter_of_last_name}

Implemente o método Library.initials, que recebe dois argumentos, first_name e last_name, que contêm o primeiro nome e o sobrenome do autor. O método deve retornar as iniciais do autor.

Library.initials("William", "Shakespeare")
# => "W.S"

3. Descriptografar uma letra

Parte da literatura está criptografada e a biblioteca tem muitos textos criptografados. A biblioteca gostaria de um novo sistema de descriptografia para uma criptografia especial.

A criptografia funciona pegando a letra e substituindo pela letra que vem antes dela no alfabeto. Por exemplo, a vira z, b vira a, c vira b, e assim por diante.

A biblioteca gostaria que fosse possível descriptografar tanto letras maiúsculas quanto minúsculas, mantendo o mesmo caso da letra original.

Implemente o método Library.decrypt_character, que recebe um argumento character, que contém a letra a descriptografar. O método deve retornar a letra descriptografada.

Library.decrypt_character('a')
# => 'z'

4. Descriptografar um texto

A biblioteca também gostaria de descriptografar um texto inteiro, com a criptografia que usa a letra anterior no alfabeto.

O descriptografador deve descriptografar apenas letras e deixar todos os outros caracteres como estão.

Implemente o método Library.decrypt_text, que recebe um argumento text, que contém o texto a descriptografar. O método deve retornar o texto descriptografado.

Library.decrypt_text("Ifmmp Xpsme!")
# => "Hello World!"
Editar via GitHub O link abre em uma nova janela ou aba
Crystal Exercism

Tudo pronto para começar Biblioteca de Luton?

Crie sua conta no Exercism para aprender e dominar Crystal com 26 conceitos142 exercícios e mentoria humana de verdade, tudo de graça.