Percursos
/
Gleam
Gleam
/
Exercícios
/
Seguidor da moda
Seguidor da moda

Seguidor da moda

Exercício de aprendizagem

Introdução

Campos com rótulo

Quando uma variante de um tipo personalizado contém dados, chama-se registo, e cada valor contido reside num campo.

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

Para facilitar a leitura, o Gleam permite dar um rótulo aos campos.

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

Os rótulos podem ser usados para dar os argumentos ao construtor de um registo por qualquer ordem.

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 registo.

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

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

Quando um tipo personalizado tem uma única variante, pode usar-se a sintaxe de atualização de registos para criar um novo registo a partir de um já 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 na correspondência de padrões para extrair valores de registos.

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

Se quisermos fazer correspondência apenas com alguns dos campos, podemos usar o operador de propagação .. para ignorar os restantes campos.

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

Instruções

Neste exercício és um grande fã de desporto e acabaste de descobrir uma paixão pelo basquetebol da NBA. Como és novo no basquetebol da NBA, estás a explorar a história da NBA em profundidade, a acompanhar equipas, treinadores e as respetivas estatísticas de vitórias e derrotas, e a compará-los entre si.

Como ainda não tens uma equipa favorita, vais também desenvolver um algoritmo para descobrir se deves torcer por uma determinada equipa.

Tens sete tarefas que te ajudam a desenvolver o teu algoritmo proprietário torcer por uma equipa.

1. Define o modelo

Define o registo Coach com os dois campos seguintes:

  • name: o nome do treinador, do tipo String.
  • former_player: indica se o treinador é um antigo jogador, do tipo Bool.

Define o registo Stats com os dois campos seguintes:

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

Define o registo Team com os três campos seguintes:

  • name: o nome da equipa, do tipo String.
  • coach: o treinador da equipa, do tipo Coach.
  • stats: as estatísticas da equipa, do tipo Stats.

2. Cria o treinador de uma equipa

Implementa a função create_coach, que recebe o nome do treinador e o seu estado de antigo jogador como parâmetros e devolve o registo Coach:

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

3. Cria as estatísticas de uma equipa

Implementa a função create_stats, que recebe o número de vitórias e o número de derrotas como parâmetros e devolve o registo Stats:

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

4. Cria uma equipa

Implementa a função create_team, que recebe o nome da equipa, o treinador e o registo como parâmetros e devolve o registo 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. Substitui o treinador

Como os donos das equipas da NBA são impacientes, descobriste que os maus resultados da equipa levavam muitas vezes à substituição do treinador. Implementa a função replace_coach, que recebe a equipa e o seu novo treinador como parâmetros e devolve a equipa, mas com o novo treinador:

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. Verifica se é a mesma equipa

Enquanto analisas as estatísticas, manténs listas de equipas e dos respetivos registos. Às vezes enganas-te e há entradas duplicadas na tua lista. Implementa a função is_same_team, que recebe duas equipas e devolve True se forem a mesma equipa; caso contrário, devolve 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. Verifica se deves torcer por uma equipa

Depois de analisares muitas equipas e jogos, chegaste a um algoritmo. Se uma das condições seguintes for verdadeira, torces por essa equipa:

  • O nome do treinador é "Gregg Popovich"
  • O treinador é um antigo jogador
  • O nome da equipa é os "Chicago Bulls"
  • A equipa ganhou 60 ou mais jogos
  • A equipa tem mais derrotas do que vitórias

Implementa a função root_for_team, que recebe uma equipa e devolve True se deves torcer por essa equipa; caso contrário, devolve 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 A ligação abre numa nova janela ou separador
Gleam Exercism

Estás pronto para começar Seguidor da moda?

Inscreve-te no Exercism para aprenderes e dominares Gleam com 33 conceitos122 exercícios, e mentoria humana real, tudo grátis.