Rutas
/
F#
F#
/
Ejercicios
/
Subido al carro
Subido al carro

Subido al carro

Ejercicio de aprendizaje

Introducción

Registros

Un registro es una colección de campos (que pueden ser de tipos diferentes) que van juntos. Para definir un registro se usa la palabra clave type. Los campos de un registro se definen entre los caracteres { y }, y cada campo tiene un nombre y un tipo. Para crear un registro, especifica los nombres de los campos y asígnales un valor entre los caracteres { y }. Todos los campos deben tener asignado un valor cuando se crea un registro. Se puede acceder a los valores de los campos de una instancia de registro mediante la notación de punto.

Al definir o crear un registro, cada campo debe estar en una línea distinta o separado por puntos y comas (;) cuando esté en una sola línea.

// Define a record
type Address =
    { Street: string
      HouseNumber: int }

// Create a record
let oldAddress: Address =
    { Street = "Main Street"
      HouseNumber = 17 }

// Single-line alternative
type ConciseAddress = { Street: string; HouseNumber: int }
let conciseAddress: ConciseAddress = { Street = "Main Street"; HouseNumber = 17 }

Como los registros son inmutables, una vez construido un registro los valores de sus campos no pueden cambiar nunca. Si quieres cambiar los valores de un registro, la palabra clave with te permite crear una copia de un registro existente, pero con valores nuevos para uno o varios campos.

// Copy the old address but change the house number
let newAddress: Address = { oldAddress with HouseNumber = 86 }
newAddress.Street      // => "Main Street"
newAddress.HouseNumber // => 86

Los registros tienen igualdad estructural, lo que significa que dos instancias del mismo registro con valores idénticos son equivalentes.

Además de poder usar la notación de punto para acceder a los campos de un registro, los registros también se pueden deconstruir en enlaces y en la coincidencia de patrones:

let myAddress: Address = { Street = "Broadway"; HouseNumber = 123 }
let { Street = myStreet; HouseNumber = myHouseNumber } = myAddress

match myAddress with
| { HouseNumber = 1 } -> printfn "First house"
| { HouseNumber = houseNumber; Street = street } -> printfn "House number %d on %s" houseNumber street
// => "House number 123 on Broadway

Instrucciones

En este ejercicio eres un gran aficionado al deporte y acabas de descubrir una 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 desarrollarás un algoritmo para decidir si animar a un equipo en concreto.

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

1. Define el modelo

Define el registro Coach con los siguientes dos campos:

  • Name: el nombre del entrenador, de tipo string.
  • FormerPlayer: indica si el entrenador es un exjugador, de tipo bool.

Define el registro Stats con los siguientes dos campos:

  • Wins: el número de victorias, de tipo int.
  • Losses: el número de derrotas, de tipo int.

Define el registro Team con los siguientes tres campos:

  • 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 createCoach, que toma el nombre del entrenador y su condición de exjugador como parámetros, y devuelve su registro Coach:

createCoach "Larry Bird" true
// => { Name = "Larry Bird"; FormerPlayer = true }

3. Crea las estadísticas de un equipo

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

createStats 58 24
// => { Wins = 58; Losses = 24 }

4. Crea un equipo

Implementa la función createTeam, que toma el nombre del equipo, el entrenador y el registro como parámetros, y devuelve su registro Team:

let coach = createCoach "Larry Bird" true
let record = createStats 58 24
createTeam "Indiana Pacers" coach record
// => { Name = "Indiana Pacers"
//      Coach = { Name = "Larry Bird"; FormerPlayer = true }
//      Stats = { Wins = 58; Losses = 24 } }

5. Sustituye al entrenador

Ante la impaciencia de los propietarios de la NBA, descubriste que los malos resultados del equipo a menudo provocaban que se sustituyera al entrenador. Implementa la función replaceCoach, que toma el equipo y su nuevo entrenador como parámetros, y devuelve el equipo, pero con el nuevo entrenador:

let coach = createCoach "Larry Bird" true
let record = createStats 58 24
let team = createTeam "Indiana Pacers" coach record

let newCoach = createCoach "Isiah Thomas" true
replaceCoach team newCoach
// => { Name = "Indiana Pacers"
//      Coach = { Name = "Isiah Thomas"; FormerPlayer = true }
//      Stats = { Wins = 58; Losses = 24 } }

6. Comprueba si son el mismo equipo

Mientras profundizas en las estadísticas, mantienes listas de equipos y sus registros. A veces te equivocas y hay entradas duplicadas en tu lista. Implementa la función isSameTeam, que toma dos equipos y devuelve true si son el mismo equipo; en caso contrario, devuelve false:

let pacersCoach = createCoach "Larry Bird" true
let pacersStats = createStats 58 24
let pacersTeam = createTeam "Indiana Pacers" pacersCoach pacersStats

let lakersCoach = createCoach "Del Harris" false
let lakersStats = createStats 61 21
let lakersTeam = createTeam "LA Lakers" lakersCoach lakersStats

isSameTeam pacersTeam lakersTeam
// => false

7. Comprueba si deberías animar a un equipo

Después de haber visto 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 un exjugador
  • El nombre del equipo es «Chicago Bulls»
  • El equipo ha ganado 60 partidos o más
  • El equipo tiene más derrotas que victorias

Implementa la función rootForTeam, que toma un equipo y devuelve true si deberías animar a ese equipo; en caso contrario, return false:

let spursCoach = createCoach "Gregg Popovich" false
let spursStats = createStats 56 26
let spursTeam = createTeam "San Antonio Spurs" spursCoach spursStats
rootForTeam spursTeam
// => true
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
F# Exercism

¿Listo para empezar Subido al carro?

Regístrate en Exercism para aprender y dominar F# con 18 conceptos148 ejercicios y mentoría humana real, todo gratis.