Rutas
/
Julia
Julia
/
Ejercicios
/
Etiquetas con el nombre
Etiquetas con el nombre

Etiquetas con el nombre

Ejercicio de aprendizaje

Introducción

Muchos lenguajes tienen una forma, como null o none, de indicar un valor inexistente. Como Julia está diseñada para manejar grandes volúmenes de datos (a menudo desordenados), tiene varias formas de representar la nada.

El objetivo general es señalar los valores ausentes o sospechosos a medida que se encuentran y luego continuar sin lanzar una excepción.

nothing

Si un valor realmente no existe, se representa con nothing. Esto es probablemente lo más parecido a lo que harían C (NULL) o Python (None).

julia> n = nothing

julia> isnothing(n)
true

julia> typeof(n)
Nothing

Así que nothing es un valor singleton de tipo Nothing, y podemos comprobarlo.

Un uso habitual de nothing es como valor devuelto (inexistente) para funciones que solo se utilizan por sus efectos secundarios (imprimir, configurar la red o lo que sea).

missing

Para situaciones en las que un valor existe en teoría pero no sabemos cuál es, se usa missing. Por ejemplo, al contar los vehículos que circulan por una carretera, puede que los observadores humanos necesiten un descanso o que los sensores automáticos se averíen, pero el tráfico sigue fluyendo.

Por lo tanto, missing es un marcador de posición que avisa a las personas de que tienen que decidir cómo gestionar ese hueco en los datos.

julia> mv = [1, 2, missing]
3-element Vector{Union{Missing, Int64}}:
 1
 2
  missing

julia> typeof(mv)
Vector{Union{Missing, Int64}} (alias for Array{Union{Missing, Int64}, 1})

julia> ismissing.(mv)  # broadcast function, displays as 1 for true, 0 for false
3-element BitVector:
 0
 0
 1

Pocos lenguajes más tienen esta funcionalidad integrada, pero hay equivalentes cercanos como NA en R o NULL en SQL.

Las expresiones suelen devolver missing de forma predeterminada si hay valores missing presentes. Si quieres que estos valores se ignoren, usa la función skipmissing() para dejarlo explícito:

julia> mv = [1, 2, missing]
3-element Vector{Union{Missing, Int64}}:
 1
 2
  missing

julia> sum(mv)  # missing in, missing out
missing

julia> skipmissing(mv)
skipmissing(Union{Missing, Int64}[1, 2, missing])

julia> collect(skipmissing(mv))
2-element Vector{Int64}:
 1
 2

julia> sum(skipmissing(mv))  # functions like sum() can work with iterators
3

Como skipmissing crea un iterador, envuélvelo en collect() si necesitas un vector.

A veces resulta útil sustituir los valores missing por algún valor predeterminado. La macro @coalesce() resulta útil para esto, ya que devuelve el primer valor que no sea missing (o missing si no hay ningún otro).

julia> str = ["I", "exist", missing]
3-element Vector{Union{Missing, String}}:
 "I"
 "exist"
 missing

julia> [@coalesce(s, "-") for  s in str]
3-element Vector{String}:
 "I"
 "exist"
 "-"

NaN

Abreviatura de «Not a Number», NaN señala un problema de cálculo en situaciones en las que se esperaba un número.

julia> v = [0, 1, -1]
3-element Vector{Int64}:
  0
  1
 -1

julia> v / 0
3-element Vector{Float64}:
 NaN
  Inf
 -Inf
 
julia> sum(v / 0)
NaN

Cualquier tipo de cálculo sobre datos que incluyan un NaN dará como resultado NaN.

Actualmente no hay ninguna función especial para eliminar los valores NaN, pero la función estándar filter() puede hacerlo de forma bastante sencilla. Solo se copiarán al array de resultado los valores para los que una condición dada sea true:

julia> filter(!isnan, [1, 2, NaN])
2-element Vector{Float64}:
 1.0
 2.0

Instrucciones

En este ejercicio escribirás código para crear insignias con el nombre que llevarán puestas los empleados de la fábrica. Los empleados tienen un ID, un nombre y el nombre de su departamento. Las etiquetas de las insignias de los empleados tienen el siguiente formato: "[id] - name - DEPARTMENT".

1. Crea una insignia para un empleado

Implementa la función print_name_badge. Debe recibir un ID, un nombre y un departamento. Debe devolver la etiqueta de la insignia, con el nombre del departamento en mayúsculas.

julia> print_name_badge(67, "Katherine Williams", "Strategic Communication")
"[67] - Katherine Williams - STRATEGIC COMMUNICATION"

2. Crea una insignia para un empleado nuevo

Debido a una peculiaridad del sistema informático, a veces los empleados nuevos todavía no tienen un ID cuando empiezan a trabajar en la fábrica. Como las insignias son obligatorias, recibirán una insignia temporal sin el prefijo del ID.

Amplía la función print_name_badge. Cuando falte el ID, debe crear una insignia sin él.

julia> print_name_badge(missing, "Robert Johnson", "Procurement")
"Robert Johnson - PROCUREMENT"

3. Crea una insignia para el propietario

Incluso el propietario de la fábrica tiene que llevar una insignia en todo momento. Sin embargo, el propietario no tiene departamento y nunca lo tendrá: está por encima de todos los departamentos. En este caso, la etiqueta debe devolver "OWNER" en lugar del nombre del departamento.

Amplía la función print_name_badge. Cuando el departamento sea nothing, supón que la insignia pertenece al propietario de la empresa.

julia> print_name_badge(204, "Rachel Miller", nothing)
"[204] - Rachel Miller - OWNER"

Ten en cuenta que es posible que el propietario sea también un empleado nuevo.

julia> print_name_badge(missing, "Rachel Miller", nothing)
"Rachel Miller - OWNER"

4. Calcula el salario total de los empleados sin ID

Como medida aproximada de lo bien que se están emitiendo los ID, quieres ver el salario combinado de los empleados que no tienen ID. Un valor alto significa que hay muchos esperando o que el problema afecta a empleados veteranos: ambas cosas son malas.

Implementa la función salaries_no_id, que recibe un vector de ID y un vector correspondiente de salarios, y devuelve la suma de los salarios de las personas que todavía no tienen ID. Ambos vectores tienen la misma longitud.

julia> ids = [204, missing, 210, 352, missing, 263]
julia> salaries = [23, 21, 47, 35, 17, 101] * 1000
julia> salaries_no_id(ids, salaries)
38,000
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Julia Exercism

¿Listo para empezar Etiquetas con el nombre?

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