マインスイーパーは、マスの周囲(上下左右と斜め)にいくつの地雷があるかを示す数字のヒントを頼りに、地雷を見つけていく人気のゲームです。
課題は、完成したマインスイーパーのボードにある空のマスに、地雷の数を書き込むことです。ボード自体は長方形で、空のマス(' ')か地雷('*')のどちらかであるマスからできています。
それぞれの空のマスについて、そのマスに隣り合う地雷の数(上下左右と斜め)を数えます。隣り合う地雷が1つもない空のマスは、空のままにします。そうでなければ、隣り合う地雷の数に置き換えます。
たとえば、次のような5×4のボードが渡されることがあります(ここでは、空のマスを画面上に表示するために'·'という文字で表しています)。
·*·*·
··*··
··*··
·····
これをコードで変換すると、次のようになります。
1*3*1
13*31
·2*2·
·111·
入力と出力はすべてASCIIです。
RustのStringと&strはUTF-8です。そのため、"Hello".chars()は単純だと思うかもしれませんが、実際には各文字がu8で1つ、2つ、3つ、4つ分の長さになっているかを確認する必要があります。
&strがASCIIだとわかっていれば、.as_bytes()を呼び出して、その内部のデータを&[u8](バイトスライス)として参照できます。
ASCIIバイトのスライスを繰り返し処理するほうがずっと速いです。なぜなら、コードポイントが関与せず、ASCIIバイトはすべてu81つ分の長さだからです。
入力をクローンせずに、この課題を完了できますか?