Rutas
/
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 de 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 los String no tienen. Se crean con comillas simples (') y solo permiten que se coloque dentro un único punto de código Unicode.

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

Es bastante habitual trabajar con Char cuando se trabaja con String en Crystal, ya que bastantes 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

Como un Char es un punto de código Unicode de 32 bits, admite incrementos y decrementos, lo que 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 Char de la tabla Unicode, y Char#pred, que devuelve el Char anterior de la tabla Unicode.

'a'.succ
# => 'b'

'z'.pred
# => 'y'

Concatenación

Como un Char solo está pensado para representar un punto de código Unicode de 32 bits, no se pueden concatenar dos Char. Por lo tanto, los Char solo se pueden 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úsculas o en minúsculas. Aquí tienes una lista con algunos de esos 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úsculas
Char#uppercase? Devuelve true si el Char está en mayúsculas
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

Convertir entre puntos de código y Char

Como un 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 correspondiente a ese punto de código.

'a'.ord
# => 97

97.chr
# => 'a'

Convertir entre tipos

Al igual que con otros tipos de datos, los Char tienen algunos métodos para convertir entre tipos. El más habitual 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 gran biblioteca con una amplia colección de literatura, que abarca desde libros hasta arte. La biblioteca tiene una sección en la que se estudia literatura y se añaden libros al sistema informático.

Ciertas partes pretenden automatizarse y te han pedido que les ayudes. Esto incluye ayudar con cosas que van desde automatizar los formularios del proceso de inscripción hasta ayudar a descifrar textos.

1. Obtener la primera letra del título

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

Implementa el método Library.first_letter, que recibe un argumento title, que 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. Obtener las iniciales del autor

La biblioteca tiene muchos libros escritos por distintos autores. A menudo se hace referencia a los autores por sus iniciales, así que la biblioteca pidió un sistema que proporcione las iniciales del autor introduciendo su nombre y su apellido. Las iniciales deben tener este 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, que contienen el nombre y el apellido del autor. El método debe devolver las iniciales del autor.

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

3. Descifrar una letra

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

El cifrado funciona tomando la letra y sustituyé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 fuese capaz de descifrar tanto letras mayúsculas como minúsculas y que conserve si son mayúsculas o minúsculas igual que la letra original.

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

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

4. Descifrar un texto

A la biblioteca también le gustaría descifrar un texto completo, con el cifrado que toma la letra anterior del alfabeto.

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

Implementa el método Library.decrypt_text, que recibe un argumento text, que contiene el texto que hay que 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 pestaña nueva
Crystal Exercism

¿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.