Trilhas
/
Gleam
Gleam
/
Exercícios
/
Oportunista
Oportunista

Oportunista

Exercício de aprendizagem

Introdução

Campos rotulados

Quando uma variante de um tipo personalizado contém dados, ela é chamada de registro, e cada valor contido fica em um campo.

pub type Rectangle {
  Rectangle(
    Float, // The first field
    Float, // The second field
  )
}

Para facilitar a leitura, o Gleam permite rotular os campos com um nome.

pub type Rectangle {
  Rectangle(
    width: Float,
    height: Float,
  )
}

Os rótulos podem ser usados para passar os argumentos em qualquer ordem ao construtor de um registro.

let a = Rectangle(height: 10.0, width: 20.0)
let b = Rectangle(width: 20.0, height: 10.0)

a == b
// -> True

Quando um tipo personalizado tem apenas uma variante, a sintaxe de acesso .label pode ser usada para obter os campos de um registro.

let rect = Rectangle(height: 10.0, width: 20.0)

rect.height // -> 10.0
rect.width  // -> 20.0

A sintaxe de atualização de registro pode ser usada quando um tipo personalizado tem uma única variante, para criar um novo registro a partir de um existente, mas com alguns dos campos substituídos por novos valores.

let rect = Rectangle(height: 10.0, width: 20.0)
let tall_rect = Rectangle(..rect, height: 50.0)

tall_rect.height // -> 50.0
tall_rect.width  // -> 20.0

Os rótulos também podem ser usados no casamento de padrões para extrair valores de registros.

pub fn is_tall(rect: Rectangle) {
  case rect {
    Rectangle(height: h, width: _) if h >. 20.0 -> True
    _ -> False
  }
}

Se quisermos casar apenas com alguns dos campos, podemos usar o operador de espalhamento .. para ignorar os campos restantes.

pub fn is_tall(rect: Rectangle) {
  case rect {
    Rectangle(height: h, ..) if h >. 20.0 -> True
    _ -> False
  }
}

Instruções

Neste exercício, você é um grande fã de esportes e acabou de descobrir uma paixão pelo basquete da NBA. Como está começando agora no basquete da NBA, você está mergulhando fundo na história da NBA, acompanhando times, técnicos, suas estatísticas de vitórias e derrotas, e comparando-os entre si.

Como você ainda não tem um time favorito, também vai desenvolver um algoritmo para descobrir se deve torcer por um determinado time.

Você tem sete tarefas para ajudar a desenvolver seu algoritmo proprietário de torcer por um time.

1. Defina o modelo

Defina o record Coach com os dois campos a seguir:

  • name: o nome do técnico, do tipo String.
  • former_player: indica se o técnico foi um ex-jogador, do tipo Bool.

Defina o record Stats com os dois campos a seguir:

  • wins: o número de vitórias, do tipo Int.
  • losses: o número de derrotas, do tipo Int.

Defina o record Team com os três campos a seguir:

  • name: o nome do time, do tipo String.
  • coach: o técnico do time, do tipo Coach.
  • stats: as estatísticas do time, do tipo Stats.

2. Crie o técnico de um time

Implemente a função create_coach, que recebe o nome do técnico e seu status de ex-jogador como parâmetros e retorna seu record Coach:

create_coach("Larry Bird", True)
// -> Coach(name: "Larry Bird", former_player: True)

3. Crie as estatísticas de um time

Implemente a função create_stats, que recebe o número de vitórias e o número de derrotas como parâmetros e retorna seu record Stats:

create_stats(58, 24)
// -> Stats(wins: 58, losses: 24)

4. Crie um time

Implemente a função create_team, que recebe o nome do time, o técnico e o record como parâmetros e retorna seu record Team:

let coach = create_coach("Larry Bird", True)
let stats = create_stats(58, 24)
create_team("Indiana Pacers", coach, stats)
// -> Team(
//   name: "Indiana Pacers",
//   coach: Coach(name: "Larry Bird", FormerPlayer = True),
//   stats: Stats(wins: 58, losses: 24),
// ) 

5. Troque o técnico

Como os donos de times da NBA são impacientes, você descobriu que resultados ruins do time muitas vezes levavam à troca do técnico. Implemente a função replace_coach, que recebe o time e seu novo técnico como parâmetros e retorna o time, mas com o novo técnico:

let coach = create_coach("Larry Bird", True)
let record = create_stats(58, 24)
let team = create_team("Indiana Pacers", coach, record)

let new_coach = create_coach("Isiah Thomas", True)
replace_coach(team, new_coach)
// -> Team(
//   name: "Indiana Pacers",
//   coach: Coach(name: "Isiah Thomas", FormerPlayer = True),
//   stats: Stats(wins: 58, losses: 24),
// ) 

6. Verifique se é o mesmo time

Enquanto analisa estatísticas, você mantém listas de times e seus records. Às vezes, você erra e há entradas duplicadas na sua lista. Implemente a função is_same_team, que recebe dois times e retorna True se forem o mesmo time, caso contrário, retorna False:

let pacers_coach = create_coach("Larry Bird", True)
let pacers_stats = create_stats(58, 24)
let pacers_team = create_team("Indiana Pacers", pacers_coach, pacers_stats)

let lakers_coach = create_coach("Del Harris", False)
let lakers_stats = create_stats(61, 21)
let lakers_team = create_team("LA Lakers", lakers_coach, lakers_stats)

is_same_team(pacers_team, lakers_team)
// -> False

7. Verifique se você deve torcer por um time

Depois de analisar muitos times e partidas, você criou um algoritmo. Se uma das condições a seguir for verdadeira, você torce por esse time:

  • O nome do técnico é "Gregg Popovich"
  • O técnico é um ex-jogador
  • O nome do time é o "Chicago Bulls"
  • O time venceu 60 jogos ou mais
  • O time tem mais derrotas do que vitórias

Implemente a função root_for_team, que recebe um time e retorna True se você deve torcer por esse time, caso contrário, retorna False:

let spurs_coach = create_coach("Gregg Popovich", False)
let spurs_stats = create_stats(56, 26)
let spurs_team = create_team("San Antonio Spurs", spurs_coach, spurs_stats)
root_for_team(spurs_team)
// -> True
Editar via GitHub O link abre em uma nova janela ou aba
Gleam Exercism

Tudo pronto para começar Oportunista?

Crie sua conta no Exercism para aprender e dominar Gleam com 33 conceitos122 exercícios e mentoria humana de verdade, tudo de graça.