Rutas
/
Julia
Julia
/
Ejercicios
/
Los encantamientos de Elyse
Los encantamientos de Elyse

Los encantamientos de Elyse

Ejercicio de aprendizaje

Introducción

Uno de los objetivos principales de Julia es poder hacer cálculos con datos numéricos de forma rápida y eficiente. Muchísimos datos numéricos.

Normalmente, los datos se guardan en arrays (o en algún tipo relacionado), así que es razonable decir que los arrays son el corazón del lenguaje Julia.

Los arrays pueden tener un tamaño arbitrario (limitado solo por la memoria de tu hardware) y pueden tener cualquier número de dimensiones.

Este concepto introductorio se centra en los fundamentos de los arrays de una dimensión, que se llaman Vectores.

Crear Vectores

En Julia, un Vector es una secuencia ordenada de valores a los que se puede acceder mediante un número de índice.

La forma más sencilla de crear un Vector es enumerar los valores entre corchetes:

julia> num_vec = [1, 4, 9]
3-element Vector{Int64}:
 1
 4
 9

julia> str_vec = ["arrays", "are", "important"]
3-element Vector{String}:
 "arrays"
 "are"
 "important"

El tipo del Vector coincide con el tipo de cada elemento.

¿Entonces los Vectores tienen que ser homogéneos (todos los elementos del mismo tipo)?

En cierto modo, sí, y se recomienda buscarlo si quieres el mejor rendimiento. Sin embargo, Julia puede sortear esta limitación (cuando es necesario) usando el tipo Any:

julia> mixed_vector = [1, "str", 'c']
3-element Vector{Any}:
 1
  "str"
  'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)

Cuando se crea un Vector vacío, Julia usa el tipo de elemento Any por defecto, pero se puede definir de forma más concreta anotando el array vacío con el tipo de elemento que quieras.

julia> empty_vec = []
Any[]

julia> empty_int_vec = Int64[]
Int64[]

Lee y recuerda esta regla:

  • Por defecto, la indexación en Julia empieza en 1, no en 0.

Esto le resultará familiar a quien haya usado otros lenguajes de ciencia de datos (R, Matlab, Fortran...), pero puede resultar chocante para informáticos con experiencia en lenguajes de tipo C.

Por lo demás, los índices funcionan como te imaginas: solo tienes que ponerlos entre corchetes:

squares = [0, 1, 4, 9, 16]
squares[1]  # 0
squares[3]  # 4
squares[begin]  # 0 ("begin" is synonym for 1)
squares[end]  # 16 ("end" is synonym for length(squares))

Fíjate en lo cómodo que es indexar con end (que es muy útil) y con begin (que probablemente no lo sea).

Si vienes de Python, quizá te preguntes por los índices negativos. Ni te molestes: no forman parte de Julia y lanzarán un BoundsError, igual que cualquier índice menor que 1 o mayor que length(squares).

Operaciones con vectores

Los vectores en Julia son mutables: podemos cambiar el contenido de celdas individuales.

julia> vals = [1, 3, 5, 7]
4-element Vector{Int64}:
 1
 3
 5
 7

julia> vals[2] = 4  # reassign the value of this element
4

# Only the value at position 2 changes:
julia> vals
4-element Vector{Int64}:
 1
 4
 5
 7

Hay muchas funciones disponibles para manipular vectores, aunque la documentación de Julia las generaliza a «colecciones» en lugar de vectores.

Ten en cuenta que, por convención, las funciones que mutan su entrada llevan un ! en el nombre. El compilador no lo impone, pero es una convención muy fuerte en el mundo de Julia.

Estas son algunas de las funciones útiles:

  • Para añadir valores al final del vector, usa push!().
  • Para eliminar el último valor, usa pop!().
  • Para operar sobre el principio del vector, las funciones correspondientes son pushfirst!() y popfirst!().
  • Para insertar o eliminar un elemento en cualquier posición, tienes insert!() y deleteat!().
julia> vals = [1, 3]
2-element Vector{Int64}:
 1
 3

julia> push!(vals, 5, 6)  # can add multiple values
4-element Vector{Int64}:
 1
 3
 5
 6

julia> pop!(vals)  # mutates vals, return popped value
6

julia> vals
3-element Vector{Int64}:
 1
 3
 5

Instrucciones

Como aspirante a maga, Elyse necesita practicar algunos conceptos básicos. Tiene una pila de cartas que quiere manipular.

Para que todo sea un poco más fácil, solo usa las cartas del 1 al 10, de modo que su pila de cartas se puede representar con un vector de números. La posición de una carta concreta se corresponde con el índice en el vector.

1. Obtén una carta de la pila

Para coger una carta, devuelve la carta que está en el índice position de la pila dada.

julia> stack = [1, 2, 4, 1];
julia> position = 3;
julia> get_item(stack, position)
4

2. Intercambia una carta de la pila

Haz un poco de prestidigitación e intercambia la carta que está en el índice position por la carta de reemplazo que se te proporciona. Devuelve la pila ajustada.

julia> stack = [1, 2, 4, 1];
julia> position = 3;
julia> replacement_card = 6;
julia> set_item!(stack, position, replacement_card)
[1, 2, 6, 1]

3. Inserta una carta en la parte superior de la pila

Haz aparecer una carta insertando una nueva carta en la parte superior de la pila. Devuelve la pila ajustada.

julia> stack = [5, 9, 7, 1];
julia> new_card = 8;
julia> insert_item_at_top!(stack, new_card)
[5, 9, 7, 1, 8]

4. Elimina una carta de la pila

Haz desaparecer una carta eliminando de la pila la carta que está en la position dada. Devuelve la pila ajustada.

julia> stack = [3, 2, 6, 4, 8];
julia> position = 3;
julia> remove_item!(stack, position)
[3, 2, 4, 8]

5. Elimina la carta superior de la pila

Haz desaparecer una carta eliminando la carta que está en la parte superior de la pila. Devuelve la pila ajustada.

julia> stack = [3, 2, 6, 4, 8];
julia> remove_item_from_top!(stack)
[3, 2, 6, 4]

6. Inserta una carta en la parte inferior de la pila

Haz aparecer una carta insertando una nueva carta en la parte inferior de la pila. Devuelve la pila ajustada.

julia> stack = [5, 9, 7, 1];
julia> new_card = 8;
julia> insert_item_at_bottom!(stack, new_card)
[8, 5, 9, 7, 1]

7. Elimina una carta de la parte inferior de la pila

Haz desaparecer una carta eliminando la carta que está en la parte inferior de la pila. Devuelve la pila ajustada.

julia> stack = [8, 5, 9, 7, 1];
julia> remove_item_at_bottom!(stack)
[5, 9, 7, 1]

8. Comprueba el tamaño de la pila

Comprueba si el tamaño de la pila es igual a stack_size o no.

julia> stack = [3, 2, 6, 4, 8];
julia> stack_size = 4;
julia> check_size_of_stack(stack, stack_size)
false
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Julia Exercism

¿Listo para empezar Los encantamientos de Elyse?

Regístrate en Exercism para aprender y dominar Julia con 35 conceptos128 ejercicios y mentoría humana real, todo gratis.