Trilhas
/
F#
F#
/
Exercícios
/
Observador de pássaros
Observador de pássaros

Observador de pássaros

Exercício de aprendizagem

Introdução

Arrays

Um array (ou vetor) em F# é uma coleção mutável de zero ou mais valores com comprimento fixo. Isso significa que, depois que um array é criado, seu tamanho não pode mudar, mas seus valores podem. Todos os valores de um array precisam ter o mesmo tipo. Os arrays podem ser definidos assim:

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

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

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

Os elementos podem ser atribuídos a um array ou recuperados dele usando um índice. Os arrays em F# são indexados a partir do 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 por funções e operadores definidos no módulo Array, ou manualmente com correspondência de padrões usando o 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"

Você também pode descartar um valor na correspondência de padrões; quando você não se importa com um valor em um caso específico (ou seja, você não vai usar um valor), você pode usar um sublinhado ('_') para indicar isso:

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 '_' sozinho deve sempre vir por último na correspondência de padrões; todo valor que não corresponder a nenhum dos outros casos será tratado por esse caso.

Instruções

Você adora observar pássaros e acompanha quantos pássaros visitaram seu jardim nos últimos sete dias.

Você tem seis tarefas, todas sobre os números de pássaros que visitaram seu jardim.

1. Confira quais foram as contagens da semana passada

Para fins de comparação, você sempre mantém por perto uma cópia das contagens da semana passada, que foram: 0, 2, 5, 3, 7, 8 e 4. Defina o binding lastWeek que contém as contagens da semana passada:

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

2. Confira quantos pássaros visitaram ontem

Implemente a função yesterday para retornar quantos pássaros visitaram seu jardim ontem. As contagens de pássaros 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. Calcule o número total de pássaros visitantes

Implemente a função total para retornar o número total de pássaros que visitaram seu jardim:

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

4. Verifique se houve um dia sem pássaros visitantes

Implemente a função dayWithoutBirds que retorna true se houve um dia em que zero pássaros visitaram o jardim; caso contrário, retorne false:

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

5. Incremente a contagem de hoje

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

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

6. Verifique se a semana é incomum

Ao longo do último ano, você percebeu que algumas semanas têm os mesmos padrões incomuns:

  • Em cada dia par da semana, não havia pássaros
  • Em cada dia par da semana, exatamente 10 pássaros foram avistados
  • Em cada dia ímpar da semana, exatamente 5 pássaros foram avistados

Implemente a função unusualWeek que retorna true se o padrão de contagem de pássaros desta semana corresponder a um dos padrões incomuns:

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

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

(Repare 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 O link abre em uma nova janela ou aba
F# Exercism

Tudo pronto para começar Observador de pássaros?

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