Trilhas
/
Julia
Julia
/
Exercícios
/
Crachás de nome
Crachás de nome

Crachás de nome

Exercício de aprendizagem

Introdução

Muitas linguagens têm uma forma como null ou none de indicar um valor inexistente. Como Julia foi projetada para lidar com grandes volumes de dados (muitas vezes bagunçados), ela tem várias formas de representar o nada.

O objetivo geral é sinalizar valores ausentes ou suspeitos conforme eles aparecem, e então continuar sem lançar uma exceção.

nothing

Se um valor realmente não existe, ele é representado por nothing. Provavelmente é o que mais se aproxima do que o C (NULL) ou o Python (None) fazem.

julia> n = nothing

julia> isnothing(n)
true

julia> typeof(n)
Nothing

Então nothing é um valor singleton do tipo Nothing, e podemos testá-lo.

Um uso comum de nothing é como valor de retorno (ou de não retorno) de funções que existem apenas pelos seus efeitos colaterais (imprimir, configurar a rede, ou qualquer outra coisa).

missing

Para situações em que um valor existe em teoria, mas não sabemos qual é, usa-se missing. Por exemplo, ao contar veículos que trafegam por uma estrada, observadores humanos podem precisar fazer uma pausa ou sensores automáticos podem falhar, mas o tráfego continua fluindo.

Assim, missing é um marcador de posição, avisando às pessoas que elas precisam decidir como lidar com essa lacuna nos dados.

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

Poucas outras linguagens têm esse recurso embutido, mas analogias próximas são NA no R ou NULL no SQL.

As expressões geralmente retornam missing por padrão se houver valores missing. Se você quiser que esses valores sejam ignorados, use a função skipmissing() para deixar isso 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 cria um iterador, envolva-o em collect() se você precisar de um vetor.

Às vezes é útil substituir valores missing por algum padrão. A macro @coalesce() é útil para isso, pois retorna o primeiro valor que não for missing (ou missing se não houver mais nada).

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

Abreviação de "Not a Number", NaN sinaliza um problema de cálculo em situações em que se esperava um 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

Qualquer tipo de cálculo sobre dados que incluam um NaN dará um resultado NaN.

No momento não existe uma função especial para remover valores NaN, mas a função filter() padrão consegue fazer isso de forma bem simples. Só os valores para os quais alguma condição dada é true serão copiados para o array resultante:

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

Instruções

Neste exercício, você vai escrever código para criar crachás que os funcionários da fábrica vão usar. Cada funcionário tem um ID, um nome e o nome de um departamento. As etiquetas dos crachás dos funcionários seguem este formato: "[id] - name - DEPARTMENT".

1. Crie um crachá para um funcionário

Implemente a função print_name_badge. Ela deve receber um ID, um nome e um departamento. Ela deve retornar a etiqueta do crachá, com o nome do departamento em letras maiúsculas.

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

2. Crie um crachá para um novo funcionário

Por causa de uma peculiaridade do sistema, às vezes os novos funcionários ainda não têm um ID quando começam a trabalhar na fábrica. Como o crachá é obrigatório, eles recebem um crachá temporário, sem o prefixo com o ID.

Estenda a função print_name_badge. Quando o ID estiver ausente, ela deve criar um crachá sem ele.

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

3. Crie um crachá para o dono

Até o dono da fábrica precisa usar um crachá o tempo todo. No entanto, o dono não tem um departamento e nunca vai ter: ele está acima de todos os departamentos. Nesse caso, a etiqueta deve retornar "OWNER" no lugar do nome do departamento.

Estenda a função print_name_badge. Quando o departamento for nothing, considere que o crachá pertence ao dono da empresa.

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

Repare que é possível que o dono também seja um novo funcionário.

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

4. Calcule o salário total dos funcionários sem ID

Como uma métrica aproximada de quão bem os IDs estão sendo emitidos, você quer ver o salário somado dos funcionários sem ID. Um valor alto significa que muita gente está esperando, ou que o problema está afetando funcionários mais experientes: as duas coisas são ruins.

Implemente a função salaries_no_id, que recebe um vetor de IDs e um vetor correspondente de salários, e retorna a soma dos salários das pessoas que ainda não têm ID. Os dois vetores têm o mesmo comprimento.

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 via GitHub O link abre em uma nova janela ou aba
Julia Exercism

Tudo pronto para começar Crachás de nome?

Crie sua conta no Exercism para aprender e dominar Julia com 35 conceitos128 exercícios e mentoria humana de verdade, tudo de graça.