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.
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:
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).
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:
push!().pop!().pushfirst!() y popfirst!().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
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.
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
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]
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]
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]
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]
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]
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]
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
Regístrate en Exercism para aprender y dominar Julia con 35 conceptos128 ejercicios y mentoría humana real, todo gratis.