SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事(AD)

ITエンジニアの実務スキルを見抜ける「CodeIQ」で、コードゴルフ問題を出してみた

  • このエントリーをはてなブックマークに追加

出題の背景

 出題の切っ掛けは、「CodeIQ」の担当の方から「マンガ付きのプログラム問題」の出題を依頼されたことです。サイトへの集客と活性化が主眼ということでしたので、依頼通りの企画(マンガ付き問題)とは別に、依頼者側の本来の意図を満たすであろう企画を携えて打ち合わせに行きました。

工夫その1:明確な指標で競い合わせる

 その企画が「ランキング付きのコードゴルフ問題」でした。私を含めてITエンジニアの多くは、「明確な数値で評価でき」かつ「自分の実力が絶対的評価で判定される」「パズル的な問題」に、かなり心を動かされます。そこで「コードゴルフ」を行うのが目的に適っているだろうと考えました。

 「コードゴルフ」は、ゴルフがカップインまでの打数を競うように、プログラムのソースの文字を削り、なるべく短くプログラムを書く遊びです。以下、実例です。1から100までの整数をすべて足すプログラムです。

コードゴルフの例(JavaScript)
// 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() {★}」の「★」の部分の文字数になります。

コードゴルフの問題(323文字)
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;
}
出力結果
出力結果

言語仕様の熟知

 まずは知識の確認です。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%まで短縮できたことになります。

次のページ
出題の結果

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6926 2013/01/08 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング