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.
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'
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
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 |
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'
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)
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.
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'
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"
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'
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!"
Crie sua conta no Exercism para aprender e dominar Crystal com 26 conceitos142 exercícios e mentoria humana de verdade, tudo de graça.