Un objetivo central de Julia es poder hacer cálculos sobre datos numéricos de forma rápida y eficiente. Muchísimos datos numéricos.
Por lo general, los datos se almacenarán 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.
Esta introducción se centra en lo básico 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 se corresponde con el tipo de cada elemento.
¿Entonces los vectores tienen que ser homogéneos (todos los elementos del mismo tipo)?
Hasta cierto punto, sí, y se recomienda apuntar a esto si quieres el mejor rendimiento.
Sin embargo, Julia puede sortear esta limitación (cuando sea 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 creas un vector vacío, Julia usa por defecto el tipo de elemento Any, pero puedes definirlo de forma más específica anotando el array vacío con el tipo de elemento que quieras.
julia> empty_vec = []
Any[]
julia> empty_int_vec = Int64[]
Int64[]
Por favor, lee y recuerda esta regla:
Esto les resulta familiar a quienes han usado otros lenguajes de ciencia de datos (R, Matlab, Fortran...), pero puede parecer sorprendente a los informáticos con experiencia en lenguajes tipo C.
Por lo demás, los índices funcionan como 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 tanto).
Quienes programan en Python quizá se pregunten por los índices negativos.
No lo hagas: 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.
Fíjate en que, por convención, las funciones que mutan su entrada llevan ! 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 futura maga, Elyse necesita practicar algunos conceptos básicos. Tiene una pila de cartas que quiere manipular.
Para que las cosas sean un poco más fáciles, solo usa las cartas del 1 al 10, así que su pila de cartas se puede representar con un vector de números. La posición de una carta determinada corresponde al índice en el vector.
Para tomar 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 juego de manos e intercambia la carta del índice position con la carta de reemplazo proporcionada.
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 carta nueva 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 carta nueva 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]
Verifica 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.