exercismとは?
exercismは無料でプログラミング言語の学習ができるサイトです。65以上の言語に対応していますが、今回はjqの問題全50問をすべてやってみました。
jqって何?
jqは言語じゃなくてツールじゃないの?って思った人もいるかと思います。たしかにjqはJSONデータの整形や変換によく使われるコマンドですが、プログラミング言語としても十分な機能を備えています。awkと同じような感じですね。実際、exercismのjqトラックのページにも、以下のように書かれています。
jq is a dynamically-typed functional programming language.
「jqは動的型付けの関数プログラミング言語です」とのこと。関数型言語は使ったことがなかったので、今回やってみることにしました。
問題を解いてみる
というわけで、さっそく問題をやってみます。最初はお約束の "Hello, world"。それから順次、簡単な問題から解いていきます。問題は難易度に応じてラベルが振られています。
レベル | 説明 |
---|---|
Learning Exercise | 学習用問題 (入門レベル) |
Easy | 初級 |
Medium | 中級 |
Hard | 上級 |
問題を解いたらテストプログラムを実行し、それにパスしたら提出して完了になります。コードレビューを受けたり相談したりすることもできるようですが、私は結局1回も利用しなかったのでどんな感じなのかはわかりません。
解答を提出すると、他の人が公開した解答も参照できるようになります。最初のうちは調子良く解いて行っていたのですが、難易度が上がってくると模範解答ってどんな感じなんだろうって思いますよね?そんなわけで他の人の解答を見てみたのですが、自分の半分くらいの行数ですっきり書いてる人がいたのに驚愕・・・
というわけで、それからは簡潔なコードを心がけて解くようにしたのですが、「これで十分だろう」と思って提出してもほぼ毎回、自分よりずっと簡潔なコードを書いている人がいたので、普段自分がいかにテキトーなコードを書いているか思い知らされる結果となりました。
ちなみに提出した解答が勝手に公開されることはありませんのでご安心を。提出後、公開するというアクションを実行したときだけ公開されます。
ハードな問題
最初のうちは問題が簡単だったので1日5〜6問ずつやれば50問くらいすぐだろうとタカをくくっていたのですが、難易度がMediumになってくるとだんだんスピードが落ちてきます。そこをなんとかクリアしても、Hardになるともはや1問解くのに数日かかるくらいに。もちろんほかに用事もあるので一日中問題をやっているわけではないのですが、それにしても気合を入れて臨まないと挫折してしまいそうなレベル。幸いちょうど冬休みに入ったので、貴重な休みを使ってなんとか全問クリアしました。
ちなみにHardは4問だけでこんな感じです。
問題名 | 説明 |
---|---|
Two Bucket | バケツ問題。3Lと5Lのバケツで4Lの水をくみ出すのにかかる回数を答える。バケツの容量とくみ出す水の量の組み合わせはいろいろ。 |
Forth | スタック指向のプログラミング言語Forth(のサブセット)の構文解析と実行。 |
Knapsack | いわゆるナップサック問題。 |
Zebra | いわゆるゼブラ・パズル。 |
自分としては最後のZebraが一番の難問でした。わりと有名な問題らしいですが、最初問題を読んだときはこんなのどうやってコードにするの?って感じ。結局コード化自体はなんとかなったのですが、再帰コールで解を探し回るロジックのバグを取るのが大変。jqはデバッガーがないので、デバッグメッセージを埋め込んで頑張るしかないです。
結果
- 解いた問題数: 50問
- かかった時間: 約3週間
- 書いたコード: こちら(GitHub)
コードは正直、人に見せるには恥ずかしいレベルのものもありますが、ご愛嬌ということで。
感想
感想としてはやはり、やってみて良かった!ですね。プログラミングから遠ざかっていてリハビリを兼ねて取り組んでみたのですが、わりと良いトレーニングになりました。問題が思っていたよりも良くできていて、最後まで飽きることなく続けられました。以下は良いと思った点です。
- 問題の質が高く、やっていて楽しい
- 入門レベルから上級レベルまで順に解いていくことができるので取り組みやすい
- オンラインだけでなくローカルマシン上でもできるので、慣れた環境でコードが書ける (テストと提出まですべてローカルでできます)
- 他の人の解答が見ることで気づきや学びを得られる
おまけ
コンプリートしたらCompleterバッチがもらえました。これまで1,177人がコンプリートしていて、全ユーザーの0.15%にあたるそうです。律儀に一つの言語を全問解く人はあまりいない模様。