Percursos
/
F#
F#
/
Exercícios
/
Observador de aves
Observador de aves

Observador de aves

Exercício de aprendizagem

Introdução

Arrays

Um array (ou vetor) em F# é uma coleção mutável de zero ou mais valores com um comprimento fixo. Isto significa que, depois de criado um array, o seu tamanho não pode mudar, mas os seus valores podem. Os valores de um array têm de ser todos do mesmo tipo. Os arrays podem ser definidos da seguinte forma:

let empty = [| |]
let emptyAlternative = Array.empty

let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5

let threeValues = [| "a"; "b"; "c" |]

Podes atribuir elementos a um array ou obtê-los a partir dele através de um índice. Os arrays de F# começam em zero, o que significa que o índice do primeiro elemento é sempre zero:

let numbers = [| 2; 3; 5 |]

// Update value in array
numbers[2] <- 9

// Read value from array
numbers[2]
// => 9

Os arrays são manipulados através de funções e operadores definidos no módulo Array ou, manualmente, com correspondência de padrões através do padrão array:

let describe array =
    match array with
    | [| |] -> "Empty"
    | [| 1; 2; three |] -> sprintf "1, 2, %d" three
    | _ -> "Other"

describe [| |]         // => "Empty"
describe [| 1; 2; 4 |] // => "1, 2, 4"
describe [| 5; 7; 9 |] // => "Other"

Também podes descartar um valor durante a correspondência de padrões. Quando não te importas com um valor num caso específico (ou seja, não vais usar esse valor), podes usar um underscore ('_') para o indicar:

let describe array =
    match array with
    | [| |] -> "Empty array"
    | [| x |] -> "Array with one item"
    | [| _; y |] -> "Array with two items (first item ignored)"
    | _ -> "Array with many items (all items ignored)"

describe [| |]          // => "Empty array"
describe [| 1 |]        // => "Array with one item"
describe [| 5; 7 |]     // => "Array with two items (first item ignored)"
describe [| 5; 7; 9 |]  // => "Array with many items (all items ignored)"

O '_' isolado deve ficar sempre em último lugar na correspondência de padrões: todos os valores que não correspondam a nenhum dos outros casos serão tratados por este caso.

Instruções

És um observador de aves entusiasta que acompanha quantas aves visitaram o teu jardim nos últimos sete dias.

Tens seis tarefas, todas relacionadas com o número de aves que visitaram o teu jardim.

1. Verifica quais foram as contagens da semana passada

Para poderes comparar, tens sempre por perto uma cópia das contagens da semana passada, que foram: 0, 2, 5, 3, 7, 8 e 4. Define a ligação lastWeek que contém as contagens da semana passada:

lastWeek
// => [| 0; 2; 5; 3; 7; 8; 4 |]

2. Verifica quantas aves visitaram ontem

Implementa a função yesterday para devolver quantas aves visitaram o teu jardim ontem. As contagens de aves estão ordenadas por dia: o primeiro elemento é a contagem do dia mais antigo e o último é a contagem de hoje.

yesterday [| 3; 5; 0; 7; 4; 1 |]
// => 4

3. Calcula o número total de aves visitantes

Implementa a função total para devolver o número total de aves que visitaram o teu jardim:

total [| 3; 5; 0; 7; 4; 1 |]
// => 20

4. Verifica se houve um dia sem aves visitantes

Implementa a função dayWithoutBirds, que devolve true se houve um dia em que zero aves visitaram o jardim; caso contrário, devolve false:

dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true

5. Incrementa a contagem de hoje

Implementa a função incrementTodaysCount para incrementar a contagem de hoje e devolver as contagens atualizadas:

let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]

6. Verifica se a semana é invulgar

Ao longo do último ano, descobriste que algumas semanas têm os mesmos padrões invulgares:

  • Em cada dia par da semana, não havia aves
  • Em cada dia par da semana, foram avistadas exatamente 10 aves
  • Em cada dia ímpar da semana, foram avistadas exatamente 5 aves

Implementa a função unusualWeek, que devolve true se o padrão de contagem de aves desta semana corresponder a um dos padrões invulgares:

unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true

unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true

(Repara que a paridade dos dias é indexada a partir de 1, não de 0: o primeiro elemento do array corresponde a um dia ímpar)

Editar via GitHub A ligação abre numa nova janela ou separador
F# Exercism

Estás pronto para começar Observador de aves?

Inscreve-te no Exercism para aprenderes e dominares F# com 18 conceitos148 exercícios, e mentoria humana real, tudo grátis.