Tracks
/
F#
F#
/
Übungen
/
Vogelbeobachter
Vogelbeobachter

Vogelbeobachter

Lernübung

Einführung

Arrays

Ein array in F# ist eine veränderliche Sammlung von null oder mehr Werten mit fester Länge. Das bedeutet, dass sich die Größe eines Arrays nach seiner Erstellung nicht mehr ändern kann, seine Werte aber schon. Alle Werte in einem Array müssen denselben Typ haben. Arrays lassen sich wie folgt definieren:

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

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

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

Über einen Index kannst du Elemente einem Array zuweisen oder aus ihm abrufen. F#-Arrays sind nullbasiert, das heißt, der Index des ersten Elements ist immer null:

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

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

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

Arrays werden entweder mit Funktionen und Operatoren aus dem Array-Modul bearbeitet oder manuell per Musterabgleich mit dem array-Muster:

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"

Beim Musterabgleich kannst du einen Wert auch verwerfen; wenn dir ein Wert in einem bestimmten Fall nicht wichtig ist (das heißt, du wirst den Wert nicht verwenden), kannst du dies mit einem Unterstrich ('_') kennzeichnen:

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

Der einzelne '_' sollte beim Musterabgleich immer zuletzt stehen; jeder Wert, der auf keinen der anderen Fälle passt, wird von diesem Fall behandelt.

Anleitung

Du bist ein begeisterter Vogelbeobachter und hältst fest, wie viele Vögel in den letzten sieben Tagen deinen Garten besucht haben.

Es gibt sechs Aufgaben, die sich alle mit der Anzahl der Vögel befassen, die deinen Garten besucht haben.

1. Prüfe, wie die Zählungen letzte Woche waren

Zu Vergleichszwecken hast du immer eine Kopie der Zählungen der letzten Woche in der Nähe, und zwar: 0, 2, 5, 3, 7, 8 und 4. Definiere die Bindung lastWeek, die die Zählungen der letzten Woche enthält:

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

2. Prüfe, wie viele Vögel gestern zu Besuch waren

Implementiere die Funktion yesterday, die zurückgibt, wie viele Vögel gestern deinen Garten besucht haben. Die Vogelzählungen sind nach Tagen geordnet, wobei das erste Element die Zählung des ältesten Tages und das letzte Element die heutige Zählung ist.

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

3. Berechne die Gesamtzahl der zu Besuch gekommenen Vögel

Implementiere die Funktion total, die die Gesamtzahl der Vögel zurückgibt, die deinen Garten besucht haben:

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

4. Prüfe, ob es einen Tag ohne zu Besuch gekommene Vögel gab

Implementiere die Funktion dayWithoutBirds, die true zurückgibt, wenn es einen Tag gab, an dem null Vögel den Garten besucht haben; andernfalls gibt sie false zurück:

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

5. Erhöhe die heutige Zählung

Implementiere die Funktion incrementTodaysCount, um die heutige Zählung zu erhöhen und die aktualisierten Zählungen zurückzugeben:

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

6. Prüfe auf eine ungewöhnliche Woche

Im letzten Jahr hast du festgestellt, dass manche Wochen dieselben, ungewöhnlichen Muster haben:

  • An jedem geraden Tag der Woche gab es keine Vögel
  • An jedem geraden Tag der Woche wurden genau 10 Vögel gesichtet
  • An jedem ungeraden Tag der Woche wurden genau 5 Vögel gesichtet

Implementiere die Funktion unusualWeek, die true zurückgibt, wenn das Vogelzählmuster dieser Woche einem der ungewöhnlichen Muster entspricht:

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

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

(Beachte, dass die Tagesparität 1-basiert ist und nicht 0-basiert: Das erste Element im Array entspricht einem ungeraden Tag)

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
F# Exercism

Bereit, mit Vogelbeobachter zu starten?

Melde dich bei Exercism an, um F# mit 18 Konzepte148 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.