ロボットの工場出荷時の設定を管理します。
ロボットが工場のラインから出てきたとき、名前はまだありません。
ロボットの電源を初めて入れると、大文字2文字のあとに3桁の数字が続く形式のランダムな名前が生成されます。たとえばRX837やBC811のような名前です。
ときどき、ロボットを工場出荷時の設定にリセットする必要があります。これは、その名前が消去されることを意味します。 次に名前を尋ねると、そのロボットは新しいランダムな名前で応答します。
名前はランダムでなければなりません。予測できる並びになってはいけません。 ランダムな名前を使うということは、名前が重複するリスクを伴います。 解答では、存在するすべてのロボットが一意の名前を持つようにする必要があります。
テストスイートは、デフォルトでは約100個の名前しか生成しません。 有効な名前は約70万通りあるので、衝突が起きる可能性はごくわずかです。 テストスイートだけでなく、別の方法でも自分の解答で衝突が起きないか確かめてみることを検討しましょう。
この演習では、Juliaの型システムの探求を続けます。今回はミュータブルな型を扱い、さらに乱数の生成にも触れます。
ロボットを工場出荷時の設定にリセットするのは、手術のようなものだと想像してみましょう。対象に手は加えますが、対象そのものを入れ替えるわけではありません。 ロボットをリセットすると新しいロボットが作られる、というふうに問題をモデル化することもできたでしょう。しかし、すべての問題をイミュータブルなデータ構造だけでモデル化できるわけではありません(純粋関数型の言語でも、ランタイムの内部ではミュータブルなものを扱っています!)。
Juliaでは、引数を変更する関数には、慣習として!という接尾辞を付けます。
ですから、ここでその役割を担うメソッドの名前はreset!になります。
これは単なる慣習にすぎませんが、公開されているJuliaのコードはほとんどがこれに従っています。とても役に立つと、きっと感じるようになるはずです!
一意な名前を生成するメソッド、ロボットを表す構造体、ロボットをリセットするメソッド、そしてロボットの名前を取得するメソッドを定義する必要があります。
まずは衝突を気にせず、ロボットにランダムな名前を付けるだけのプログラムを設計し、そのあとで、重複した名前が二度と発行されないような仕組みを考えて設計するとよいでしょう。 設計するときは、名前が尽きていくにつれて、名前の生成にかかる実行時間がどう変わるかをよく考えてください。呼び出し元には、どんな保証を提供したいでしょうか?