Rutas
/
Gleam
Gleam
/
Ejercicios
/
Subido al carro
Subido al carro

Subido al carro

Ejercicio de aprendizaje

Introducción

Campos etiquetados

Cuando una variante de un tipo personalizado contiene datos, se denomina registro, y cada valor que contiene reside en un campo.

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

Para facilitar la legibilidad, Gleam permite etiquetar los campos con un nombre.

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

Las etiquetas permiten dar los argumentos al constructor de un registro en cualquier orden.

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

a == b
// -> True

Cuando un tipo personalizado tiene una sola variante, se puede usar la sintaxis de acceso .label para obtener los campos de un registro.

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

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

La sintaxis de actualización de registros se puede usar cuando un tipo personalizado tiene una sola variante para crear un registro nuevo a partir de uno existente, pero con algunos de los campos sustituidos por valores nuevos.

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

Las etiquetas también se pueden usar al hacer coincidencia de patrones para extraer valores de los registros.

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

Si solo queremos buscar coincidencias en algunos de los campos, podemos usar el operador de propagación .. para ignorar los campos restantes.

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

Instrucciones

En este ejercicio eres un gran aficionado al deporte y acabas de descubrir tu pasión por el baloncesto de la NBA. Como eres nuevo en el baloncesto de la NBA, te estás sumergiendo a fondo en la historia de la NBA, haciendo un seguimiento de equipos y entrenadores, de sus estadísticas de victorias y derrotas, y comparándolos entre sí.

Como todavía no tienes un equipo favorito, también vas a desarrollar un algoritmo para averiguar si conviene animar a un equipo en particular.

Tienes siete tareas que te ayudarán a desarrollar tu propio algoritmo para decidir a qué equipo animar.

1. Define el modelo

Define el registro Coach con los dos campos siguientes:

  • name: el nombre del entrenador, de tipo String.
  • former_player: indica si el entrenador es exjugador, de tipo Bool.

Define el registro Stats con los dos campos siguientes:

  • wins: el número de victorias, de tipo Int.
  • losses: el número de derrotas, de tipo Int.

Define el registro Team con los tres campos siguientes:

  • name: el nombre del equipo, de tipo String.
  • coach: el entrenador del equipo, de tipo Coach.
  • stats: las estadísticas del equipo, de tipo Stats.

2. Crea el entrenador de un equipo

Implementa la función create_coach, que recibe como parámetros el nombre del entrenador y si este es exjugador, y devuelve su registro Coach:

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

3. Crea las estadísticas de un equipo

Implementa la función create_stats, que recibe como parámetros el número de victorias y el número de derrotas, y devuelve su registro Stats:

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

4. Crea un equipo

Implementa la función create_team, que recibe como parámetros el nombre del equipo, el entrenador y las estadísticas, y devuelve su registro 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. Sustituye al entrenador

Como los propietarios de la NBA son impacientes, descubriste que los malos resultados de un equipo a menudo llevaban a que se sustituyera al entrenador. Implementa la función replace_coach, que recibe como parámetros el equipo y su nuevo entrenador, y devuelve el equipo pero con el nuevo entrenador:

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. Comprueba si es el mismo equipo

Mientras profundizas en las estadísticas, llevas arrays con equipos y sus estadísticas. A veces te equivocas y aparecen entradas duplicadas en tu array. Implementa la función is_same_team, que recibe dos equipos y devuelve True si son el mismo equipo; en caso contrario, devuelve 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. Comprueba si deberías animar a un equipo

Tras haber observado muchos equipos y partidos, has ideado un algoritmo. Si se cumple alguna de las siguientes condiciones, animas a ese equipo:

  • El nombre del entrenador es «Gregg Popovich»
  • El entrenador es exjugador
  • El nombre del equipo es «Chicago Bulls»
  • El equipo ha ganado 60 o más partidos
  • El equipo tiene más derrotas que victorias

Implementa la función root_for_team, que recibe un equipo y devuelve True si deberías animar a ese equipo; en caso contrario, devuelve 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 en GitHub El enlace se abre en una ventana o pestaña nueva
Gleam Exercism

¿Listo para empezar Subido al carro?

Regístrate en Exercism para aprender y dominar Gleam con 33 conceptos122 ejercicios y mentoría humana real, todo gratis.