Trilhas
/
F#
F#
/
Exercícios
/
Oportunista
Oportunista

Oportunista

Exercício de aprendizagem

Introdução

Registros

Um registro é uma coleção de campos (que podem ser de tipos diferentes) que pertencem juntos. Para definir um registro, usa-se a palavra-chave type. Os campos de um registro são definidos entre os caracteres { e }, e cada campo tem um nome e um tipo. Para criar um registro, especifique os nomes dos campos e atribua um valor a eles entre os caracteres { e }. Todos os campos precisam receber um valor na criação de um registro. Os valores dos campos de uma instância de registro podem ser acessados com notação de ponto.

Ao definir/criar um registro, cada campo deve estar em uma linha separada ou ser separado por pontos e vírgulas (;) quando estiver em uma única linha.

// 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 registros são imutáveis, depois que um registro é construído, os valores dos seus campos nunca podem mudar. Se você quiser alterar os valores de um registro, a palavra-chave with permite criar uma cópia de um registro existente, mas com novos valores para um ou mais campos.

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

Registros têm igualdade estrutural, o que significa que duas instâncias do mesmo registro com valores idênticos são equivalentes.

Além de poder usar a notação de ponto para acessar os campos de um registro, os registros também podem ser desconstruídos em associações e em correspondência de padrões:

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

Instruções

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

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

Você tem sete tarefas para ajudar a desenvolver seu algoritmo proprietário de torcer para 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.
  • FormerPlayer: indica se o técnico era 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 createCoach que recebe o nome do técnico e seu status de ex-jogador como parâmetros, e retorna o record Coach:

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

3. Crie as estatísticas de um time

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

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

4. Crie um time

Implemente a função createTeam que recebe o nome do time, o técnico e o record como parâmetros, e retorna o record 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. Substitua o técnico

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

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. Verifique se é o mesmo time

Enquanto analisa as 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 isSameTeam que recebe dois times e retorna true se forem o mesmo time; caso contrário, retorna 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. Verifique se você deve torcer para um time

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

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

Implemente a função rootForTeam que recebe um time e retorna true se você deve torcer para esse time; caso contrário, 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 via GitHub O link abre em uma nova janela ou aba
F# Exercism

Tudo pronto para começar Oportunista?

Crie sua conta no Exercism para aprender e dominar F# com 18 conceitos148 exercícios e mentoria humana de verdade, tudo de graça.