hello-world演習を実装したら、次は他の演習を20以上実装します。
実装できる演習には、2つの種類があります。
一般に、新しいトラックでは、まず実践演習を実装することをおすすめします。実装が簡単で、事前に考えることも少ないからです。概念演習は、トラックがきちんと動くようになってから、いつでも追加できます。
トラックが実践演習を実装しやすくするために、exercism/problem-specificationsリポジトリを用意しました。このリポジトリには、100以上ある実践演習のメタデータが含まれており、各トラックはこれを使って、そのトラック向けのバージョンの演習を実装できます。そのため、同じ演習が多くのトラックで実装されているのを目にすることになります。
では、この100以上の演習の中から、どのようにして20以上を選べばよいのでしょうか? いくつかの指針を紹介します。
100以上の演習で使われる概念は、じつにさまざまです。学習者が多様な概念を練習できる演習を実装することを目指しましょう。文字列だけに焦点を当てた演習を20個実装するのではなく、それぞれ異なる概念に焦点を当てた演習を実装してみてください。
いくつかの概念と、その例となる演習を挙げます。
| 概念 | 演習 |
|---|---|
| ビット操作 | allergies, secret-handshake |
| 真偽値 | leap |
| クラス | circular-buffer, robot-name |
| 並行処理 | bank-account |
| 条件分岐 | raindrops |
| 日付と時刻 | gigasecond, meetup |
| 等価性 | clock |
| 浮動小数点数 | darts, space-age |
| 遅延評価 | alphametics, zebra-puzzle |
| 配列 | resistor-color, spiral-matrix |
| ループ | collatz-conjecture, protein-translation |
| マップ | nucleotide-count |
| 数値 | leap, grains |
| 乱数 | dnd-character, robot-name |
| 文字列 | bob, isogram, |
| ツリー | binary-search-tree, pov |
演習によって、実装の難しさは異なります。初級・中級・上級が混ざるように、難易度に幅を持たせて演習を実装することを目指しましょう。
演習の難しさは、関わる概念やトラックの言語など、いくつかの要素によって決まります。同じ演習を実装している他のトラックで、その演習がどんなものかを見ておくと、実装がどんな形になりそうかをつかみやすくなるでしょう。
難易度ごとに、演習の例を挙げます。
| 難易度 | 演習 |
|---|---|
| 初級 | darts, gigasecond, isogram, leap, resistor-color, space-age |
| 中級 | allergies, bob, meetup, protein-translation, raindrops, secret-handshake |
| 上級 | alphametics, forth, react, pov, zebra-puzzle, zipper |
すべての演習が自分のトラックに合うとは限りません。トラックに合う演習だけを選びましょう。意味をなさない演習を実装するより、その演習を_実装しない_ほうがよいのです。たとえば、lens-person演習では、学習者が_レンズ_を扱いますが、これをサポートしていない言語もたくさんあります。
トラックに合わない演習を見つけたら、そのスラッグをトラックのconfig.jsonファイルにあるexercises.foregone配列に追加できます。こうすると、ツールがその演習を無視するようになります。
もう少し具体的にすると、最初の演習の選び方の一例は、次のようになります。
| 演習 | 難易度 | 概念 |
|---|---|---|
| hello-world | 初級 | なし(最初の演習) |
| leap | 初級 | 数値、真偽値 |
| gigasecond | 初級 | 日付と時刻 |
| isogram | 初級 | 文字列 |
| resistor-color | 初級 | 配列 |
| nucleotide-count | 初級 | マップ |
| collatz-conjecture | 初級 | ループ |
| darts | 初級 | 浮動小数点数 |
| two-fer | 初級 | 文字列フォーマット、省略可能な引数 |
| high-scores | 初級 | コレクションの処理 |
| raindrops | 中級 | 条件分岐 |
| bob | 中級 | 文字列 |
| allergies | 中級 | ビット操作 |
| series | 中級 | 例外 |
| circular-buffer | 中級 | クラス |
| meetup | 中級 | 日付と時刻 |
| yacht | 中級 | 配列 |
| dominoes | 上級 | タプル、遅延評価 |
| diamond | 上級 | 文字列フォーマット |
| alphametics | 上級 | 遅延評価 |
| forth | 上級 | パース |
トラックに含めたい演習を選んだら、次のステップはそれらを実装することです。実践演習の追加に関するドキュメントに、実践演習を追加する方法が詳しく書かれています。