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

バードウォッチャー

学習演習

はじめに

一般的な構文

forループは、同じ処理を繰り返し実行するためによく使われる文の1つです。Goでは、forキーワード、ヘッダー、そして波括弧で囲まれたループ本体を含むブロックからできています。ヘッダーは、セミコロン;で区切られた3つの要素、init・condition・postからなります。

for init; condition; post {
  // loop body - code that is executed repeatedly as long as the condition is true
}
  • initは、ループが始まる前に一度だけ実行されるコードです。
  • conditionは、真偽値に評価され、ループをいつ止めるかを制御する式でなければなりません。ループの中のコードは、この条件がtrueと評価されるかぎり実行されます。この式がfalseと評価された時点で、ループはそれ以上繰り返されません。
  • postは、各繰り返しの最後に実行されるコードです。

注意: ほかの言語とは違い、ヘッダーの3つの要素を囲む括弧(())はありません。むしろ、このような括弧を書くとコンパイルエラーになります。ただし、ループ本体を囲む波括弧({ })は常に必要です。

forループの例

ふつう、initではカウンター変数を用意し、conditionではループを続けるか止めるかを判定し、postでは繰り返しのたびに最後にカウンターをインクリメントします。

for i := 1; i < 10; i++ {
  fmt.Println(i)
}

このループは1から9までの数値(9も含む)を出力します。ステップの指定は、上の例のように、インクリメントやデクリメントの文で行うことが多いです。

説明

庭に何羽の鳥が訪れたかを記録するのが日課の、熱心なバードウォッチャーです。 ふだんはノートに正の字を書いて鳥を数えていますが、データを扱いやすくするために、ここ数週間の鳥の数をデジタル化しました。

1. これまでに数えた鳥の合計を求める

まずは全体像をつかむことから、データの分析を始めましょう。 記録を始めてから数えた鳥の合計を求めてください。

1日ごとの鳥の数を含むintのスライスを受け取る関数TotalBirdCountを実装します。 この関数は、数えた鳥の合計を返す必要があります。

birdsPerDay := []int{2, 5, 0, 7, 4, 1, 3, 0, 2, 5, 0, 1, 3, 1}
TotalBirdCount(birdsPerDay)
// => 34

2. 特定の週に訪れた鳥の数を計算する

鳥の数の全体像がつかめたので、次はより細かい分析をしてみたくなります。

1日ごとの鳥の数のスライスと週番号を受け取る関数BirdsInWeekを実装します。

この関数は、その週に数えた鳥の合計を返します。 週は常に完全に記録されているものとします。

birdsPerDay := []int{2, 5, 0, 7, 4, 1, 3, 0, 2, 5, 0, 1, 3, 1}
BirdsInWeek(birdsPerDay, 2)
// => 12

3. 数え間違いを修正する

鳥を記録している間ずっと、庭の遠くの隅に隠れている鳥が1羽いたことに気づきました。

この鳥は、1日おきにいつも庭で過ごしていたことがわかりました。

その間の日にどこにいたのかは正確にはわかりませんが、庭にいなかったことは確かです。

バードウォッチャーとしての勘で、リストで記録を始めた最初の日には、この鳥が庭にいたこともわかっています。

この新しい情報をもとに、1日ごとに数えた鳥のスライスを引数として受け取り、数え間違いを修正したスライスを返す関数FixBirdCountLogを書いてください。

birdsPerDay := []int{2, 5, 0, 7, 4, 1}
FixBirdCountLog(birdsPerDay)
// => [3 5 1 7 5 1]
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Go Exercism

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

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