Percursos
/
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 ponto de código Unicode de 32 bits. O seu tamanho torna-os eficientes em termos de memória e dá-lhes propriedades específicas que as Strings não têm. Criam-se com aspas simples (') e só permitem que se coloque lá dentro um único ponto de código Unicode.

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

É bastante comum trabalhar com Chars quando se trabalha com Strings em Crystal, já que vários métodos da classe String devolvem Chars ou recebem Chars como argumentos. Por exemplo, o método String#[] devolve um Char, e o método String#chars devolve uma coleção de Chars.

Incrementar / Decrementar

Como um Char é um ponto Unicode de 32 bits, suporta incremento e decremento. Isso faz com que, se tiveres 'a', possas obter 'b' somando um.

'a' + 5
# => 'f'

'z' - 25
# => 'a'

Existe também um método chamado Char#succ, que devolve o caráter seguinte na tabela Unicode, e Char#pred, que devolve o caráter anterior na tabela Unicode.

'a'.succ
# => 'b'

'z'.pred
# => 'y'

Concatenação

Como um Char serve apenas para representar um ponto Unicode de 32 bits, dois Chars não podem ser concatenados. Por isso, um Char só pode ser concatenado 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ção sobre um caráter, como por exemplo se é um número ou uma letra, ou se é maiúsculo ou minúsculo. Eis uma lista de alguns desses métodos; para uma lista completa, consulta a API de Char:

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

Conversão

Conversão entre pontos de código e Chars

Como um Char é um ponto Unicode de 32 bits, podes converter entre Chars e pontos de código (Int). Isto pode ser feito com o método Char#ord, que devolve o ponto de código do Char, ou com o método Int#chr, que devolve o Char do ponto de código.

'a'.ord
# => 97

97.chr
# => 'a'

Conversão entre tipos

Tal como acontece com 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 numa String. No entanto, existe também o método Char#to_i, que converte o Char num Int, e o método Char#to_f, que converte o Char num 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 secção onde se estuda literatura e se registam livros no sistema informático.

Algumas partes pretendem ser automatizadas e pedem-te ajuda. Isto inclui desde automatizar os formulários do processo de inscrição até ajudar a desencriptar textos.

1. Obter a primeira letra do título

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

Implementa o método Library.first_letter, que recebe um argumento title, que contém o título do livro. O método deve devolver 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. Frequentemente, os autores são referidos pelas suas iniciais, por isso a biblioteca pediu um sistema que devolva as iniciais do autor a partir do seu primeiro e último nome. As iniciais devem ser formatadas assim: {first_letter_of_first_name}.{first_letter_of_last_name}

Implementa o método Library.initials, que recebe dois argumentos, first_name e last_name, que contêm o primeiro e o último nome do autor. O método deve devolver as iniciais do autor.

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

3. Desencriptar uma letra

Parte da literatura está encriptada e a biblioteca tem muitos textos encriptados. A biblioteca gostaria de um novo sistema de desencriptação para uma encriptação especial.

A encriptação funciona tomando a letra e substituindo-a pela letra que a precede no alfabeto. Por exemplo, a passa a z, b passa a a, c passa a b, e assim sucessivamente.

A biblioteca gostaria que o sistema conseguisse desencriptar tanto letras maiúsculas como minúsculas, mantendo cada letra no mesmo formato da letra original.

Implementa o método Library.decrypt_character, que recebe um argumento character, que contém a letra a desencriptar. O método deve devolver a letra desencriptada.

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

4. Desencriptar um texto

A biblioteca também gostaria de desencriptar um texto inteiro encriptado com este método, que usa a letra anterior no alfabeto.

O desencriptador deve desencriptar apenas letras e deixar todos os outros carateres como estão.

Implementa o método Library.decrypt_text, que recebe um argumento text, que contém o texto a desencriptar. O método deve devolver o texto desencriptado.

Library.decrypt_text("Ifmmp Xpsme!")
# => "Hello World!"
Editar via GitHub A ligação abre numa nova janela ou separador
Crystal Exercism

Estás pronto para começar Biblioteca de Luton?

Inscreve-te no Exercism para aprenderes e dominares Crystal com 26 conceitos142 exercícios, e mentoria humana real, tudo grátis.