Tracks
/
Crystal
Crystal
/
Ejercicios
/
La biblioteca de Luton
La biblioteca de Luton

La biblioteca de Luton

Ejercicio de aprendizaje

Introducción

Char es un tipo de datos en Crystal que representa un punto de código Unicode de 32 bits. Su tamaño los hace eficientes en memoria y les da propiedades específicas que String no tiene. Se crean usando comillas simples (') y solo permiten colocar un único punto de código Unicode dentro.

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

Es bastante común trabajar con Char cuando se trabaja con String en Crystal, ya que varios métodos de la clase String devuelven Char o aceptan Char como argumentos. Por ejemplo, el método String#[] devuelve un Char, o el método String#chars devuelve una colección de Char.

Incremento y decremento

Debido a que un Char es un punto de código Unicode de 32 bits, admite incremento y decremento; esto hace que si tienes 'a', puedas obtener 'b' sumando uno.

'a' + 5
# => 'f'

'z' - 25
# => 'a'

También existe un método llamado Char#succ, que devuelve el siguiente carácter en la tabla Unicode, y Char#pred, que devuelve el carácter anterior en la tabla Unicode.

'a'.succ
# => 'b'

'z'.pred
# => 'y'

Concatenación

Dado que Char solo está pensado para representar un punto de código Unicode de 32 bits, no se pueden concatenar dos Char. Por lo tanto, Char solo se puede concatenar con String.

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

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

Métodos de propiedades

Crystal tiene algunos métodos para obtener información sobre un carácter, como si es un número o una letra, o si está en mayúscula o minúscula. Aquí tienes una lista de algunos de los métodos; para ver la lista completa, consulta la API de Char:

Método Descripción
Char#number? Devuelve true si el Char es un número
Char#letter? Devuelve true si el Char es una letra
Char#lowercase? Devuelve true si el Char está en minúscula
Char#uppercase? Devuelve true si el Char está en mayúscula
Char#ascii? Devuelve true si el Char es un carácter ASCII
Char#whitespace? Devuelve true si el Char es un carácter de espacio en blanco

Conversión

Conversión entre puntos de código y Char

Dado que Char es un punto de código Unicode de 32 bits, puedes convertir entre Char y puntos de código (Int). Esto se puede hacer con el método Char#ord, que devuelve el punto de código del Char, o con el método Int#chr, que devuelve el Char del punto de código.

'a'.ord
# => 97

97.chr
# => 'a'

Conversión entre tipos

Al igual que con otros tipos de datos, Char tiene algunos métodos para convertir entre tipos. El más común es el método Char#to_s, que convierte el Char en un String. Sin embargo, también están el método Char#to_i, que convierte el Char en un Int, y el método Char#to_f, que convierte el Char en un Float.

'a'.to_s
# => "a"

'4'.to_i
# => 4

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

Instrucciones

La biblioteca de Luton es una biblioteca grande con una gran colección de literatura, que va desde libros hasta arte. La biblioteca tiene una sección donde se estudia literatura y se agregan libros al sistema informático.

Ciertas partes buscan automatizarse y te piden que les ayudes. Esto incluye desde automatizar los formularios del proceso de inscripción hasta ayudar a descifrar textos.

1. Obtén la primera letra del título

Se supone que los libros de una biblioteca deben ser fáciles de encontrar, así que se ordenan por la primera letra del título.

Implementa el método Library.first_letter, que recibe un argumento title, el cual contiene el título del libro. El método debe devolver la primera letra del título.

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

2. Obtén las iniciales del autor

La biblioteca tiene muchos libros escritos por autores diferentes. A los autores se les suele mencionar por sus iniciales, así que la biblioteca pidió un sistema que genere las iniciales del autor al ingresar el nombre y el apellido del autor. Las iniciales deben tener el siguiente formato: {first_letter_of_first_name}.{first_letter_of_last_name}

Implementa el método Library.initials, que recibe dos argumentos, first_name y last_name, los cuales contienen el nombre y el apellido del autor. El método debe devolver las iniciales del autor.

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

3. Descifra una letra

Parte de la literatura está cifrada y la biblioteca tiene muchos textos cifrados. A la biblioteca le gustaría tener un nuevo sistema de descifrado para un cifrado especial.

El cifrado funciona tomando la letra y reemplazándola por la letra que la precede en el alfabeto. Por ejemplo, a se convierte en z, b se convierte en a, c se convierte en b, y así sucesivamente.

A la biblioteca le gustaría que pueda descifrar tanto letras mayúsculas como minúsculas y que conserve el mismo uso de mayúsculas y minúsculas que la letra original.

Implementa el método Library.decrypt_character, que recibe un argumento character, el cual contiene la letra que se va a descifrar. El método debe devolver la letra descifrada.

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

4. Descifra un texto

A la biblioteca también le gustaría poder descifrar un texto completo con este cifrado, que reemplaza cada letra por la que la precede en el alfabeto.

El descifrador solo debe descifrar letras y dejar todos los demás caracteres tal como están.

Implementa el método Library.decrypt_text, que recibe un argumento text, el cual contiene el texto que se va a descifrar. El método debe devolver el texto descifrado.

Library.decrypt_text("Ifmmp Xpsme!")
# => "Hello World!"
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Crystal Exercism

¿Todo listo para empezar La biblioteca de Luton?

Regístrate en Exercism para aprender y dominar Crystal con 26 conceptos142 ejercicios y mentoría humana real, todo gratis.