トラック
/
Elixir
Elixir
/
演習
/
船長日誌
船長日誌

船長日誌

学習演習

はじめに

ランダム性

Elixirでは、列挙可能なデータ構造(配列や範囲など)からランダムな要素を選ぶには、Enum.randomを使います。この関数は1つの要素を選び、どの要素も同じ確率で選ばれます。

Elixirには、ランダムな小数を選ぶための独自の関数はありません。そのためには、Erlangを直接使う必要があります。

Erlangのライブラリ

ElixirのコードはBEAM仮想マシン上で動作します。BEAMはErlangランタイムシステムの一部です。Erlangに着想を得て、その実行環境を共有しているため、ElixirはErlangのライブラリとの優れた相互運用性を提供します。つまり、Elixirのエンジニアは自分のElixirコードの中からErlangのライブラリを使うことができます。実際のところ、Erlangのライブラリですでに提供されている機能のためにElixirのライブラリを書くことは、Elixirコミュニティでは推奨されていません。

その結果、数学的な操作やタイマー関数など、一部の機能はElixirではErlang経由でのみ利用できます。

Erlangの標準ライブラリは、特別な手順を必要とせず、Elixirのコードで利用できます。

Erlangの関数は、Elixirの関数を呼び出すのと同じように呼び出せますが、1つだけ小さな違いがあります。Erlangのモジュール名はsnake_caseのアトムです。たとえば、mathモジュールからErlangのpi/0関数を呼び出すには、次のように書きます。

:math.pi()
# => 3.141592653589793

Elixirに相当するものがない、よく使われるErlangの関数は次のとおりです。

  • :timer.sleep/1は、指定されたミリ秒数のあいだプロセスを一時停止させます。
  • :rand.uniform/0は、0.0 <= x < 1.0を満たすランダムな小数xを生成します。
  • :io_lib.format/2は、C言語スタイルの文字列フォーマット(制御シーケンスを使用)を提供します。この関数を使えば、たとえば2から36までの任意の基数で整数を出力したり、希望する精度で小数をフォーマットしたりできます。この関数は、多くのErlang関数と同様、文字リストを返すことに注意してください。
  • mathモジュールは、sin/1、cos/1、log2/1、log10/1、pow/2などの数学関数を提供します。

Erlangの標準ライブラリについて調べるには、STDLIBリファレンスマニュアルを見てみましょう。

説明

メアリーは、テレビドラマ_Star Trek: The Next Generation_の大ファンです。彼女はよくペンと紙を使うロールプレイングゲームで遊び、友人たちと一緒に宇宙船エンタープライズの乗組員になりきります。メアリーのキャラクターはピカード艦長なので、艦長日誌を付けなければなりません。彼女はゲームの創作的な部分が大好きですが、その場でランダムなデータを生成するのは好きではありません。

艦長日誌によく登場するデータをランダムに生成する仕組みを作って、メアリーを手伝いましょう。

1. ランダムな惑星を生成する

宇宙船エンタープライズは、旅の途中でたくさんの惑星と遭遇します。スタートレックの世界の惑星は、その性質によっていくつかのクラスに分類されています。たとえば、地球はMクラスの惑星です。惑星クラスとしてあり得るのは、D・H・J・K・L・M・N・R・T・Yです。

random_planet_class/0関数を実装しましょう。この関数は、惑星クラスのいずれかをランダムに返します。

CaptainsLog.random_planet_class()
# => "K"

2. 宇宙船の登録番号をランダムに生成する

宇宙を飛び回っているのは、エンタープライズ(登録番号NCC-1701)だけではありません! 別の宇宙船とランデブーするとき、メアリーはその宇宙船の登録番号を記録する必要があります。

登録番号は、接頭辞"NCC-"で始まり、そのあとに1000から9999までの数値(両端を含む)が続きます。

宇宙船の登録番号をランダムに返すrandom_ship_registry_number/0関数を実装しましょう。

CaptainsLog.random_ship_registry_number()
# => "NCC-1947"

3. ランダムなスターデートを生成する

日付が含まれていなければ、ログに何の意味があるのでしょうか?

スターデートは浮動小数点数です。_The Next Generation_のシーズン1における宇宙船エンタープライズの冒険は、スターデート41000.0から42000.0の間で繰り広げられます。"4"は24世紀を、"1"はシーズン1を表しています。

41000.0以上42000.0未満の浮動小数点数を返すrandom_stardate/0関数を実装しましょう。

実装にはErlangの関数を使います。

CaptainsLog.random_stardate()
# => 41458.15721310934

4. スターデートをフォーマットする

艦長日誌では、スターデートは通常、小数点以下1桁に丸められます。

浮動小数点数を受け取り、小数点以下1桁に丸めた数値を文字列として返すformat_stardate/1関数を実装しましょう。

実装にはErlangの関数を使います。

CaptainsLog.format_stardate(41458.15721310934)
# => "41458.2"
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Elixir Exercism

船長日誌を始める準備はできましたか?

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