トラック
/
F#
F#
/
演習
/
バードウォッチャー
バードウォッチャー

バードウォッチャー

学習演習

はじめに

配列

F#のarrayは、長さが固定された、0個以上の値を保持する変更可能なコレクションです。つまり、一度配列を作成すると、そのサイズは変更できませんが、値は変更できます。配列内の値はすべて同じ型でなければなりません。配列は次のように定義できます:

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

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

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

要素は、インデックスを使って配列に代入したり、配列から取得したりできます。F#の配列は0から始まるため、最初の要素のインデックスは常に0です:

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

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

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

配列は、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"

パターンマッチングの際に値を_破棄_することもできます。特定のケースで値を_気にしない_場合(つまり、値を_使用_しない場合)は、アンダースコア('_')を使ってこれを表すことができます:

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

単一の'_'は、パターンマッチングの際に常に_最後_に来る必要があります。他のどのケースにも_一致しない_値はすべて、このケースで処理されます。

説明

熱心なバードウォッチャーとして、過去7日間に庭に何羽の鳥が訪れたかを記録しています。

取り組むタスクは6つあり、どれも庭に訪れた鳥の数に関するものです。

1. 先週の数を確認する

比較のために、先週の数をいつも手元に控えています。先週の数は、0、2、5、3、7、8、4でした。先週の数を保持するlastWeekという束縛を定義してください:

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

2. 昨日訪れた鳥の数を確認する

yesterday関数を実装して、昨日庭に訪れた鳥の数を返すようにしてください。鳥の数は日付の順に並んでいて、最初の要素が最も古い日の数、最後の要素が今日の数です。

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

3. 訪れた鳥の合計数を計算する

total関数を実装して、庭に訪れた鳥の合計数を返すようにしてください:

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

4. 鳥が訪れなかった日があったか確認する

庭に訪れた鳥が0羽だった日があればtrueを返し、そうでなければfalseを返すdayWithoutBirds関数を実装してください:

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

5. 今日の数を増やす

incrementTodaysCount関数を実装して、今日の数を1増やし、更新後の数を返すようにしてください:

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

6. いつもと違う週がないか確認する

この1年間で、いくつかの週には同じいつもと違うパターンがあることに気づきました:

  • 週の偶数番目の日には、鳥が1羽もいませんでした
  • 週の偶数番目の日には、ちょうど10羽の鳥が確認されました
  • 週の奇数番目の日には、ちょうど5羽の鳥が確認されました

今週の鳥の数のパターンが、こうしたパターンのいずれかに一致する場合にtrueを返すunusualWeek関数を実装してください:

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

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

(日の偶奇は0始まりではなく1始まりであることに注意してください。配列の最初の要素は奇数番目の日に対応します)

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
F# Exercism

バードウォッチャーを始める準備はできましたか?

Exercismに登録すれば、18個のコンセプト148個の演習、そして本物の人間によるメンタリングとともに、F#を学んでマスターできます。すべて無料です。