出題の背景
出題の切っ掛けは、「CodeIQ」の担当の方から「マンガ付きのプログラム問題」の出題を依頼されたことです。サイトへの集客と活性化が主眼ということでしたので、依頼通りの企画(マンガ付き問題)とは別に、依頼者側の本来の意図を満たすであろう企画を携えて打ち合わせに行きました。
工夫その1:明確な指標で競い合わせる
その企画が「ランキング付きのコードゴルフ問題」でした。私を含めてITエンジニアの多くは、「明確な数値で評価でき」かつ「自分の実力が絶対的評価で判定される」「パズル的な問題」に、かなり心を動かされます。そこで「コードゴルフ」を行うのが目的に適っているだろうと考えました。
「コードゴルフ」は、ゴルフがカップインまでの打数を競うように、プログラムのソースの文字を削り、なるべく短くプログラムを書く遊びです。以下、実例です。1から100までの整数をすべて足すプログラムです。
// 1から100の整数をすべて足す(77文字) var res = 0; for (var i = 1; i <= 100; i ++) { res += i; } console.log(res);
// 1から100の整数をすべて足す(38文字) for(r=i=0;i<=99;r+=++i);console.log(r)
// 出力 5050
また、すぐに結果が出て、確認できる方がよいだろうということで、出題のWebページには「プレイグラウンド」(実際にブラウザ上でコードを動かせる場所)も付けることにしました。そして掲載期間中は、ランキングを「CodeIQ」の公式ブログで発表していくことにしました。
工夫その2:スキルを判別する3つの仕掛け
さて、私の会社では、当面採用の予定がありません。とはいえ出題にあたって、「CodeIQ」の本来の意図である「ITエンジニアのための実務スキル評価」という部分は満たす必要があります。そこで問題の中に、解答者をふるい分けするための仕掛けを用意しました。ポイントは以下の3点です。
- 言語仕様の熟知
- 実務の発想
- アルゴリズム力
それでは実際の問題を掲載して、上記3つについて解説します。自分の実力に興味がある方は、解説を見る前に、5分から10分ほどの時間を掛けて、何文字まで縮められるかチャレンジしてみてください。解答の文字数は、「function yourCode() {★}」の「★」の部分の文字数になります。
function yourCode() { var res = ""; var w = 80; var h = 40; var sz = 30; for (var y = 0; y < h; y ++) { for (var x = 0; x < w; x ++) { var dstnc = Math.sqrt( Math.pow(w / 2 - x, 2) + Math.pow((h / 2 - y) * 2, 2) ); if (dstnc < sz) { res += "*"; } else { res += "-"; } } res += "\n" } return res; }
![出力結果](http://cz-cdn.shoeisha.jp/static/images/article/6926/output.jpg)
言語仕様の熟知
まずは知識の確認です。JavaScriptの言語仕様から、どうすれば文字数が削れるかという部分です。ここが覚束ないようだと、知識不足ということになります。一見して、どういったところが削れるかを示します。問題自体にも、少しヒントが入っています。
- タブ文字、スペース文字は削れる。
- コードゴルフということで「var」は削っても文句を言われない。
- JavaScriptでは、行末の「;」を削っても大丈夫。
- 「if」は「条件演算子(?:)」に置き換えられる。
- 「if」や「for」の「{ }」は削れる。
上記がすぐにできない場合は「あまりコードを書くことに慣れていないのかもしれない」という判定になります。これが、1つ目の判定ポイントでした。
実務の発想
問題にはトラップを用意しています。それは「Math.sqrt」「Math.pow」といった数学オブジェクトを使った計算部分です。
私は、iアプリ向けのゲームを作っていたこともあり、低スペックのマシンで、いかにゲームを動かすかということを行っていました。こういった環境では、「マシン環境に合わせた柔軟なソースを書く」ことが要求されます。実務では、こういった「環境に合わせたコーディング」が必要になることがあります。
そして低スペック環境では、呼び出しコストの高いオブジェクトへのアクセスがある場合は、「他の処理に置き換えられるのではないか?」と注目します。実際に、出題したコードでは、この部分を置き換えると文字数が激減するように設計しています。そこに気付いて、すぐに書き換えられるかどうかを1つのハードルにしました。
この仕掛けは有効に働き、「Math」をソースコードから削れた解答者は、だいたい100文字以下までソースを短縮できていました。また、「Math」を削れなかった解答者は、100文字を超える人がほとんどでした。
アルゴリズム力
「Math」の削除をクリアした後は、「計算手順を工夫する能力」の判定になります。同じ計算でも、コーディング次第で文字数を削ることができます。ここは「上級者の高度な戦い」になります。
このレベルで勝負をしている人は、基本的な能力は十分にある人だと思います。計算方法を工夫することで文字数を削ることができるレベルの人は、80文字台から70文字台で争っていました。最短でコードを書いた1位の人達(10人いました)は、75文字まで処理を短縮できていました。元が323文字なので、23%まで短縮できたことになります。