Track
/
F#
F#
/
Esercizi
/
Osservatore di uccelli
Osservatore di uccelli

Osservatore di uccelli

Esercizio di apprendimento

Introduzione

Array

Un array in F# è una collezione mutabile di zero o più valori con una lunghezza fissa. Questo significa che una volta creato un array, la sua dimensione non può cambiare, ma i suoi valori sì. I valori in un array devono avere tutti lo stesso tipo. Gli array si possono definire come segue:

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

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

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

Gli elementi possono essere assegnati a un array o recuperati da esso usando un indice. Gli array di F# partono da zero: l'indice del primo elemento è sempre zero:

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

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

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

Gli array vengono manipolati tramite funzioni e operatori definiti nel modulo Array, oppure manualmente usando il pattern matching con il pattern 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"

Puoi anche scartare un valore durante il pattern matching. Quando non ti interessa un valore in un caso specifico (cioè non lo userai), puoi usare un underscore ('_') per indicarlo:

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)"

Il singolo '_' deve sempre venire per ultimo nel pattern matching: ogni valore che non corrisponde a nessuno degli altri casi verrà gestito da questo caso.

Istruzioni

Sei un appassionato di birdwatching che tiene traccia di quanti uccelli hanno visitato il tuo giardino negli ultimi sette giorni.

Hai sei attività, tutte riguardanti il numero di uccelli che hanno visitato il tuo giardino.

1. Controlla quali erano i conteggi della settimana scorsa

Per motivi di confronto, tieni sempre a portata di mano una copia dei conteggi della settimana scorsa, che erano: 0, 2, 5, 3, 7, 8 e 4. Definisci il binding lastWeek che contiene i conteggi della settimana scorsa:

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

2. Controlla quanti uccelli hanno visitato ieri

Implementa la funzione yesterday per restituire quanti uccelli hanno visitato il tuo giardino ieri. I conteggi degli uccelli sono ordinati per giorno: il primo elemento è il conteggio del giorno più vecchio, e l'ultimo è il conteggio di oggi.

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

3. Calcola il numero totale di uccelli che hanno visitato

Implementa la funzione total per restituire il numero totale di uccelli che hanno visitato il tuo giardino:

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

4. Controlla se c'è stato un giorno senza uccelli in visita

Implementa la funzione dayWithoutBirds che restituisce true se c'è stato un giorno in cui zero uccelli hanno visitato il giardino; altrimenti, restituisce false:

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

5. Incrementa il conteggio di oggi

Implementa la funzione incrementTodaysCount per incrementare il conteggio di oggi e restituire i conteggi aggiornati:

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

6. Controlla se la settimana è insolita

Nel corso dell'ultimo anno, hai scoperto che alcune settimane hanno gli stessi schemi insoliti:

  • In ogni giorno pari della settimana, non c'erano uccelli
  • In ogni giorno pari della settimana, sono stati avvistati esattamente 10 uccelli
  • In ogni giorno dispari della settimana, sono stati avvistati esattamente 5 uccelli

Implementa la funzione unusualWeek che restituisce true se lo schema del conteggio degli uccelli di questa settimana corrisponde a uno degli schemi insoliti:

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

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

(Nota che la parità del giorno è indicizzata a 1, non a 0: il primo elemento dell'array corrisponde a un giorno dispari)

Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
F# Exercism

Vuoi iniziare Osservatore di uccelli?

Iscriviti a Exercism per imparare e padroneggiare F# con 18 concetti148 esercizi e il mentoring di persone reali, tutto gratis.