花畑

花畑

中級

はじめに

Flower Fieldは、人気ゲーム「マインスイーパー」を心温まる形で作り直したゲームです。ゲームの目的は、庭にあるすべての花を見つけることです。その手がかりになるのが数字で、そのマスに上下左右と斜めに隣接している花の数を表しています。「Flower Field」は、イタリア、ドイツ、韓国、日本、台湾のMicrosoft Windows各国語版に収録されていました。

説明

完成したFlower Fieldの庭にある空きマスに、花の数を書き込むのが課題です。 庭は長方形の盤で、マスは空きマス(' ')か花('*')のどちらかです。

空きマスごとに、そのマスに隣接する花の数(横・縦・斜め)を数えます。 隣接する花が1つもない空きマスは、空きマスのままにします。 それ以外の場合は、隣接する花の数で置き換えます。

たとえば、次のような5 x 4の盤が渡されることがあります(ここでは画面上に表示するため、空きマスを'·'という文字で表しています):

·*·*·
··*··
··*··
·····

コードはこれを次のように変換します:

1*3*1
13*31
·2*2·
·111·

パフォーマンスのヒント

入力も出力も、すべてASCIIです。 RustのStringと&strはutf8なので、"Hello".chars()は単純に思えるかもしれませんが、実際には各文字がu8何個分の長さ(1、2、3、4個)なのかを確認する必要があります。 &strがASCIIだとわかっていれば、.as_bytes()を呼び出して、内部のデータを&[u8](バイトスライス)として参照できます。 ASCIIバイトのスライスを繰り返し処理するほうがずっと速くなります。コードポイントが関わらず、ASCIIの各バイトはu81個分の長さだからです。

入力をクローンせずに、この課題を解くことはできますか?

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

花畑を始める準備はできましたか?

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

花畑を深く掘り下げよう!

入れ子の`for`ループ、境界チェックを簡単にする`min`/`max`の巧みな使い方、関数型のパイプライン、2次元配列の利用について掘り下げます。