Rutas
/
Crystal
Crystal
/
Ejercicios
/
Lista de lenguajes
Lista de lenguajes

Lista de lenguajes

Ejercicio de aprendizaje

Introducción

Array es una estructura de datos mutable que almacena una colección de elementos de un tipo específico. Un array es una estructura de datos indexable. Que los arrays sean mutables significa que, si se llama a un método sobre un array que modifica el array, el array se modificará. Es decir, no se crea un array nuevo, sino que se modifica el que ya existe.

Para crear un array, usa la sintaxis de literal de array ([]) y, dentro de ella, especifica los elementos del array separados por comas.

[1, 2, 3] # => [1, 2, 3]

Crystal inferirá el tipo del array a partir de los elementos.

[1, 2, 3].class # => Array(Int32)

Arrays de varios tipos

Aunque antes se ha mencionado que los arrays son una colección de elementos de un tipo específico, puedes crear un array con varios tipos usando tipos de unión. Esto permite que el array contenga elementos de cualquiera de los tipos especificados en el tipo de unión. Crystal inferirá el tipo del array a partir de los elementos.

[1, "2", 3.0] # => [1, "2", 3.0]

[1, "2", 3.0].class # => Array(Int32 | Float64 | String)

Arrays multidimensionales

Un array multidimensional es un array de arrays. Esto significa que cada elemento del array es, a su vez, un array. Esto puede resultar útil cuando quieres almacenar datos en formato de tabla. Para definir un array multidimensional, puedes escribir un literal de array de arrays o usar el constructor Array.new.

[[1, 2], [3, 4]]                    # => [[1, 2], [3, 4]]
numbers = Array(Array(Int32)).new() # => []
numbers << [1, 2]                   # => [[1, 2]]

Añadir un elemento a un array

Para añadir un elemento a un array, usa el operador << (append).

[1, 2, 3] << 4 # => [1, 2, 3, 4]

El tipo del elemento que quieres añadir debe ser el mismo que el tipo del array; de lo contrario, se lanzará un error.

numbers : Array(Int32 | Float64) = [1, 2, 3]
numbers << 4.0
numbers # => [1, 2, 3, 4.0]

numbers << "5" # => Error: no overload matches 'Array(Int32 | Float64)#<<' with type String

Tamaño de un array

Al igual que con String, puedes obtener el tamaño de un array usando el método size.

[1, 2, 3].size # => 3

Arrays vacíos

El compilador no puede inferir el tipo del array cuando se crea un array vacío. Por lo tanto, necesitas especificar el tipo del array. Esto se puede hacer especificando el tipo del array, usando la palabra clave of, o usando la sintaxis de inicialización de array, que es Array(T).new.

[] of (Int32 | Float64 | String)    # => []
Array(Int32 | Float64 | String).new # => []

Acceder a los elementos

Al igual que con String, puedes acceder a los elementos de un array usando el operador [] (index) y pasándole el índice del elemento al que quieres acceder. Si el índice está fuera de los límites, se lanzará un IndexError.

[1, 2, 3][0] # => 1

[1, 2, 3][3] # => Index out of bounds (IndexError)

También es posible acceder a los elementos usando un rango.

[1, 2, 3][0..1] # => [1, 2]

Crear un array a partir de un rango

Para crear un array a partir de un rango, usa el método to_a. Esto puede resultar útil cuando quieres crear un array de números.

(1..3).to_a # => [1, 2, 3]

Crear un array a partir de un string

Para crear un array a partir de un string, usa el método split. Esto te permite dividir un string en un array de strings usando un delimitador.

"1,2,3".split(",") # => ["1", "2", "3"]

También es posible obtener un array de caracteres a partir de un string usando el método chars.

"123".chars # => ['1', '2', '3']

Para convertir un array de Char o String en un String, puedes usar el método join, que recibe un delimitador como argumento.

['1', '2', '3'].join(".") # => "1.2.3"

Eliminar un elemento de un array

Cuando quieres eliminar un elemento del final de un array, puedes usar el método pop, que acepta un argumento opcional que especifica cuántos elementos hay que eliminar del final del array. El método devuelve el elemento que se ha eliminado. Si el array está vacío, se lanzará un IndexError.

numbers = [1, 2, 3]
numbers.pop # => 3
numbers     # => [1, 2]

empty_numbers = [] of Int32
empty_numbers.pop # => Index out of bounds (IndexError)

Cuando quieres eliminar un elemento de un índice concreto de un array, puedes usar el método delete_at, que recibe como argumento el índice del elemento que hay que eliminar. Si el array está vacío, se lanzará un IndexError.

numbers = [1, 2, 3]
numbers.delete_at(1) # => 2
numbers              # => [1, 3]

empty_numbers = [] of Int32
empty_numbers.delete_at(0) # => Index out of bounds (IndexError)

Modificar los valores de un array

Cuando quieres modificar un elemento de un índice concreto de un array, puedes usar el operador []= (index assign), que recibe como argumentos el índice del elemento que hay que modificar y el nuevo valor. Si el índice está fuera de los límites, se lanzará un IndexError.

numbers = [1, 2, 3]
numbers[1] = 4
numbers # => [1, 4, 3]

numbers[3] = 5 # => Index out of bounds (IndexError)

Instrucciones

En este ejercicio tienes que implementar algunos métodos para manipular un array de lenguajes de programación.

1. Define un método que devuelva un array vacío de lenguajes

Define el método LanguageList.list que no recibe argumentos y devuelve un array vacío del tipo Array(String).

LanguageList.list()
# => []

2. Define un método para añadir un lenguaje al array

Define el método LanguageList.add que recibe 2 argumentos (un array de lenguajes y un string con el nombre de un lenguaje). El método debe devolver el array con el nuevo lenguaje añadido al final del array.

language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]

3. Define un método para eliminar un lenguaje del array

Define el método LanguageList.remove que recibe 1 argumento (un array de lenguajes). El método debe devolver el array sin el último elemento. Supón que el array siempre tendrá al menos un elemento.

language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
language_list = LanguageList.remove(language_list)
# => ["Crystal"]

4. Define un método que devuelva el n-ésimo elemento del array

Define la función LanguageList.at que recibe 2 argumentos (un array de lenguajes y un índice). El método debe devolver el lenguaje que está en el índice n del array. Supón que en ese índice siempre habrá un lenguaje.

language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
LanguageList.at(language_list, 1)
# => "Ruby"

5. Define un método para analizar un string de lenguajes

Define el método LanguageList.parse que recibe 1 argumento (un string de lenguajes separados por comas). El método debe devolver un array de lenguajes.

LanguageList.parse("Crystal, Ruby")
# => ["Crystal", "Ruby"]
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Crystal Exercism

¿Listo para empezar Lista de lenguajes?

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