日の出と日の入りを眺めるために、家の近くの森にツリーハウスを建てる計画を立てています。
地元の調査会社から、地図の長方形の区画ごとに、そこにあるすべての木の高さを示すデータを入手しました。 ツリーハウスにふさわしい木を見つけるために、地図上の各グリッドを分析する必要があります。
よい木とは、次の2つの条件をどちらも満たす木です。
あなたの課題は、木の家を建てられそうな木を見つけることです。
データ会社は、木の高さを示すグリッドという形でデータを提供してくれます。 グリッドの行は東西方向を表し、列は南北方向を表します。
条件を満たす木とは、その行で最も高く、かつその列で最も低い木です。
グリッドの中に条件を満たす木がまったくないこともあります。 1本だけ見つかることもあれば、複数見つかることもあります。
次のグリッドには、候補となる木がちょうど1本あります。
↓
1 2 3 4
|-----------
1 | 9 8 7 8
→ 2 |[5] 3 2 4
3 | 6 6 7 1
つまり、[2, 1]の地点(行: 2、列: 1)は、木の家を建てるのに絶好の場所です。
Rustでは、慣例として、順序付けられた値の並びの内容には0から番号(「インデックス」)が振られます。これは、このREADMEにある演習の説明の他の部分が何と言っていても当てはまります。たとえば、1から始まるインデックスに言及していても同じです。そのため、そうしたインデックス番号をRustのインデックス番号に読み替えるには、1を引く必要があります。
この演習では、行列の内容を保存するために_ベクターのベクター_を使います。この演習は、インデックスなどのベクターに関する基本的な考え方や、入れ子のデータ型が認められることを学習者が理解できるように設計されていますが、_ベクターのベクター_は、高性能な行列演算や、より大量のデータを効率よく処理する用途には最適とは言えない選択です。
この非効率さについての詳しい説明は、この演習の範囲を超えており、この学習トラック全体の範囲も超えています。この側面はキャッシュ局所性として知られており、現代のコンピューターアーキテクチャの詳細についてもっと知りたい場合は、そのリンクをクリックするとよい入門記事が見つかります。