Raspberry Piで何かを作ろうと思ったら、おそらく_抵抗器_を使うでしょう。 この演習では、抵抗器について知っておくべきことは3つだけです:
抵抗器にはそれぞれ抵抗値があります。
抵抗器はとても小さく、抵抗値を印刷しても読み取るのが難しいほどです。 この問題を解決するために、メーカーは抵抗器に色分けされた帯を印刷して、抵抗値を示しています。
それぞれの帯は、数値の1桁として機能します。 たとえば、brownの帯(値1)の次にgreenの帯(値5)を印刷すると、それは15という数値になります。 この演習では、帯の値を覚えなくて済むように、便利なプログラムを作ります。 プログラムは3つの色を入力として受け取り、正しい値をohmsで出力します。 色の帯は次のように符号化されています:
black: 0
brown: 1
red: 2
orange: 3
yellow: 4
green: 5
blue: 6
violet: 7
grey: 8
white: 9
Resistor Color Duoでは、最初の2つの色をデコードしました。
たとえば、orange-orangeなら主となる値は33になります。
3つ目の色は、主となる値にいくつの0を追加するかを表します。
主となる値に0を加えたものが、ohmsでの値になります。
この演習では、ohmsが実際に何なのかは重要ではありません。
たとえば:
(数学が得意なら、0を10の累乗と考えてもよいでしょう。数学が苦手なら、0のままで考えてください。どちらも同じことで、数学用語ではなく普通の言葉で言い換えただけです。)
この演習では、色をラベルに変換します:
"... ohms"
したがって、"orange", "orange", "black"を入力すると、次の値を返すはずです:
"33 ohms"
より大きな抵抗器になると、ohmsのより大きな桁を表すためにSI接頭語が使われます。たとえば"kiloohms"のようにです。 これは、「2000メートル」の代わりに「2キロメートル」と言ったり、「2000グラム」の代わりに「2キログラム」と言うのに似ています。
たとえば、"orange", "orange", "orange"を入力すると、次の値を返すはずです:
"33 kiloohms"
この演習はResistor Color Duoの続きとして位置づけられたもので、その内容を土台にしています。
演習はどの順番で解いてもかまいませんが、ここで示す順番で進めることをおすすめします。
この演習では、c*という接頭辞を使ってあらかじめ定義された色の構文が与えられます。たとえばc*blackです。
次に、指示に従って、色の並びを、抵抗値とそのSI単位(場合によってはSI接頭辞付き)に対応付ける構文を定義します。
色は*[[と]]の間にあり、, で区切られます。たとえば*[[c*black, c*yellow, c*violet]]のようになります。
この課題では、おそらくnotationかマクロのどちらかを使う必要があるでしょう。 リファレンスを確認してみるとよいかもしれません。
新しい構文はコンパイル時に展開されるため、必要な構文がすべて定義されていないと、テストはコンパイルに失敗します。
そのため、従来の実行時テストに頼る代わりに、#guard_msgsを使います。
このコマンドは、与えられたdocstringと、別のコマンド(ここでは#eval)が生成したメッセージを比較し、両者が異なる場合にエラーを報告します。
エラーが出ないことを、テストの成功とみなしてかまいません。
ローカルで作業する場合も、Leanのオンラインプレイグラウンドで作業する場合も、#guard_msgsが報告したエラーはLean InfoViewを通じてすぐに確認できます。
抵抗値は、単位Ω(オーム)を使って出力してください。
このUnicode文字は、ローカルでもLeanのオンラインプレイグラウンドでも、ショートカット\ohmを使って入力できます。
Exercismのオンラインエディターで作業している場合は、この文字を指示からそのままコピーしてかまいません。
現在、オンラインテストランナーは、Leanメタプログラミングライブラリ全体のインポートをサポートしていません。
Leanでデフォルトで使える機能(Lean名前空間内のものを含む)は自由に使えますが、import Leanを追加したり、Lean名前空間から特定のモジュールをインポートしたりすると、Exercismに提出したときに解答が失敗します。
なお、この演習を解くためにLeanライブラリをインポートする必要はありません。