「結城浩さんの数学問題は、なぜ面白いのか?」を7つのポイントで解説!

結城浩さんが、エンジニア向け実務スキル評価サービス「CodeIQ」で出題していた数学の問題はいつも大人気!なぜなら結城さんは解答者をどう楽しませるかを考えつくしているから。今回は結城浩さんご自身に「なぜこんなに面白い問題を作れるのか」そのこだわりを7つのポイントに絞って書いていただきました。

はじめに

こんにちは、結城浩です。いつもCodeIQでの出題にご解答いただき、ありがとうございました。

今回は出題しているときに私が心がけていることをお話しします。

なお、以下でお話しすることはあくまで私が出題する問題に対する心がけです。たくさんの出題者さんがバリエーション豊かな出題をしています。他の問題に対して批判するという意図はまったくありませんので念のため。

8,568通り、あなたはどのタイプ?

最高の問題

出題するときに心がけていることの第一、それは最高の問題を作ろうということです。

せっかく時間を掛けて問題を作り、せっかく時間を掛けて解いてもらうのですから、「ああ、この問題を解いてよかった!」と解答者に感じてもらえるようにしたいと思っています。たとえ問題を解くことができないとしても「今回は解けなかったけど、でも、挑戦してよかった!」と感じてもらいたいのです。

8,568通り、あなたはどのタイプ?

プログラミング言語に依存しない問題

私はプログラミング言語に依存しない問題を出題するようにしています。

それは、できるだけ多くの人に挑戦してもらいたいから、という理由だけではありません。私はプログラミングを「問題解決の方法」だと思っているからです。

問題が与えられて、それを何とかして解く。これが重要なことであって、そのときにどのプログラミング言語を使うかというのはいわば副次的なことです。

「どのプログラミング言語を選ぶか」というところから、技術者の手腕は問われます。自分がよく慣れている言語だからこれを使う、あるいはこの機会に新たな言語を学びたいからこっちを使う、そのような自由度があったほうがいいのではないかと考えています。

なので、私は言語やプラットホームに依存しない問題を作っています。

このような条件では問題作成は難しくなります。つまり「書いたプログラムそのものを解答にする」という出題がしにくくなるからです。ですから、私の出題する問題は「問題を解いた結果の数字や文字列を答える」という形式が多くなっています。

その数字や文字列を作り出すためにはどんな言語を使っても構わない。プログラミング言語を使わなくてもいい。たとえばExcelを使っても、手計算でも構わない(可能なら)。そのような形式にしています。

アルゴリズムを学べる問題

出題するとき、私はアルゴリズムを学べる問題を心がけています。

プログラミング言語に依存しない問題ということから、アルゴリズムに絡む問題が多くなるのはまあ自然なことだと思います。

ですから私が出す問題は、解答者がアルゴリズムを作り出すか、探し出すかして、自分でプログラムを書き、その出力結果を提出してもらう形になることが多いですね。

そこで注意しているのは「問題文から検索キーワードが見つからないように工夫する」という点です。現代は検索キーワードが見つかればすぐに検索でアルゴリズムが見つかる時代です。解答者が検索一発で解答の参考にプログラムを見つけてしまったらつまらないでしょう。

ですから、問題の文面にはアルゴリズム名や検索キーワードのヒントを載せないように心がけています。

それはそれとして、解答者さんの側では自分なりのレギュレーションをもうけている方も多いようです。つまり「検索すれば見つかることはわかっているので検索せずに答えた」や「検索で参考になるコードも見つけたけど、あえてそれは見ずに答えた」という解答者が多いのです。

つまりそれは、挑戦者さんが、私の問題に答えるのを「学ぶ機会」と捉えているからでしょうね。

二段オチ、三段オチになっている問題

出題するとき、私は二段オチ、三段オチになっている問題にするように、心がけています。これはかなり意識しています。

解答者さんは、私の出した問題文を読んで「ははあ、これはあのアルゴリズムで解けそうだな」と考えます。そしてプログラムを実際に作ります。ところが、いざ動かそうとすると「うわっ! そういうことか! このやり方じゃダメだ!」と新たな問題を発見する……そのような問題を心がけています。

問題を実際に解いてみようとして初めてわかる驚き。解答者さんにそのような驚きを味わえってもらえるような出題を心がけています。これはドラマです。大げさにいえば、解答者さんは、サスペンスドラマの主人公になったような気分で問題を解いていくのです。

具体的にいえば、

  • 素朴なアルゴリズムでは事実上解けない問題
  • 単純な改善だけでは時間がかかりすぎるのでオーダーを改善する必要がある問題
  • 問題の性質を整理せずに書き始めるとコーディングがたいへん困難になる問題

のような問題になります。

ただし、二段オチ、三段オチというのは「引っ掛け問題」ではありません。わざと問題の誤読を誘ったり、つまらないミスに誘導する出題はしません。もともとプログラミングは細かな違いにも注意を払う必要がありますけれど、問題をわざと勘違いさせるのはよくないと思っています。

ですから、出題の文章はできるだけ平易にし、明解に出題内容が把握できるように心がけています。小さな具体例を明記して、解答者が出題内容を誤読しないようにしています。

難しすぎない問題

出題するときに、ここまで話してきたような条件を付けていくと、あっというまに問題の難易度は上がっていきます。特に「二段オチ、三段オチ、四段オチ……」などと考えていくとすぐに、誰にも解けない問題になってしまいます。

ですから私は難しすぎない問題を心がけるようにしています。

問題というものは、いくらでも解きにくくできます。無駄に複雑な要素を入れてややこしくすればいいからです。でもそれは解答者さんの側からするとたいへんつまらないものです。なので、本質的ではない複雑さはできるだけ入れないように心がけています。

興味を持てる問題

私はさらに興味を持てる問題にしたいと思っています。問題に挑戦した後で「おもしろかった」と思ってもらうのは当然としても、まずは問題に挑戦してもらわなくてはいけません。そのために何らかの味付けをしたいと考えました。

生のままごろんと問題が提示されるのではなく、物語のような具体的な「設定」がある問題。扱っている内容の本質がパッとイメージできるような問題。あるいは逆に「いったいこれは何の問題なんだろう」とミステリアスに感じられるような問題。そのような問題を作りたいと思っています。

そのような設定はとっつきやすさにもつながるでしょう。「これは何かな? お、ちょっと考えてみようか」と思ってもらうということです。(そしてその先には二段オチ、三段オチが待っているのですが……)。

充実した解説がある問題

私は充実した解説がある問題を心がけています。CodeIQでは出題者から解答者さんへ評価フィードバックを送るようになっています。その際に単に5段階評価を返すのではなく、
今回の出題内容と意図を説明し、それに関連したアルゴリズムの解説をするように心がけています。もちろん、二段オチ三段オチの種明かしもします。

充実した解説を書くために、私は採点しやすいように問題を工夫しています。たいへん多くの解答者さんの解答を読む必要があるので、採点にミスがあってはたいへんです。ですから、採点と集計そのものは機械的に行えるようにしています。それは私がさぼるためではなく、評価フィードバックで送る解説を、できるだけ充実させるためです。評価フィードバックを読んだ解答者が、「おお、なるほど」や「ふむふむ、やっぱりそうか」という納得感を持つようにしたいと思っているのです。

まとめ

以上、私が出題の際に心がけていることをいくつかお話ししました。

  • 最高の問題
  • プログラミング言語に依存しない問題
  • アルゴリズムを学べる問題
  • 二段オチ、三段オチになっている問題
  • 難しすぎない問題
  • 興味を持てる問題
  • 充実した解説がある問題

これからも結城浩の問題をよろしくお願いします。

それではまた!

CodeIQの問題に挑戦しよう!(結城浩のWebサイト)

なお、以上の記事は私が発行している結城メルマガの一部を再編集して執筆しました。よろしければ結城メルマガもご購読くださいね。

結城メルマガ

◆結城さんの問題と解説を読んでみたい!という方へ◆

過去に掲載された問題とその解説記事の初公開です!

問題は「古代文献を復元しよう!」で、通称「ナムドット」と呼ばれる問題です。

問題文

■前説

依頼者「発掘の際に古代文献の一部が破損してしまいました」
あなた「それはもったいないですね」
依頼者「そこであなたへ依頼ですが」
あなた「は?」
依頼者「あなたに破損部分を補完してほしいのです!」

■問題

あなたはナムドット考古学研究所のプログラマとして雇われました。
あなたの仕事は、発掘された「古代文献」を復元することです。
古代文献は全部で52行あるはずですが、
そのうちの途中の20行が破損して読めなくなっています。
その破損した20行を補完して「古代文献」を復元することが
あなたのミッションなのです!

■注意事項

・解答は、あなたの好きなプログラミング言語でかまいません。
・もしも、問題にあいまいな部分があったら、
 どう解釈したかを記載した上でご解答ください。

■資料

numdot.zip:
zipファイルの中には、以下の資料が入っています。

problem.txt:
問題文が書かれたファイル。

numdot.pdf:
今回の問題に必要な情報が書かれた文書。

answer.txt:
解答用ファイル。解答の形式もここに書いてあります。

numdot.txt:
データファイル。

zipで固めてありますので解凍してから参照してください。

■解答方法

answer.txt:
・このファイルに解答を書いてください。

(これは過去問題です。すでに解答受付は終了していますのでご注意ください)

正解と解説

正解と解説は以下からダウンロードしてください。

このPDFは挑戦者のみにお届けするものです。
URLの公開、PDFの再配布はご遠慮ください。

http://www.hyuki.com/codeiq/pdf/2013-09-24_numdot2661.pdf

結城浩さんのプロフィール

プログラミング言語、デザインパターン、暗号、数学などの分野で入門書を執筆。最新作は『数学ガール』シリーズ。J.S.バッハの「フーガの技法」が大好きな、プロテスタントのクリスチャン。
Twitter: @hyuki / ホームページ: http://www.hyuki.com/

※本記事は「CodeIQ MAGAZINE」掲載の記事を転載しております。

PC_goodpoint_banner2

Pagetop