CodeIQ MAGAZINECodeIQ MAGAZINE

2万5千人超のエンジニアが挑戦・正解率3%の超難問!SCRAPが仕掛ける「コードルームからの脱出」正解と解説 #コードルーム

2014.03.27 Category:CodeIQ問題解説・リーダーボード ,インタビュー Tag: ,

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

リアル脱出ゲームの「SCRAP」が仕掛け、CodeIQ上で3月に開催されたエンジニア版リアル脱出ゲーム「コードルームからの脱出」。暗号を解き、鍵を開き、箱を開け、制限時間内に最後の鍵を手に入れることができれば、脱出成功──

2万5千人以上が挑戦するも、正解率が3%ほどだった超難問。コードの迷宮から脱出するための正解と解説、出題した「SCRAP」チームのインタビューと合わせて紹介する。
by 馬場美由紀 (CodeIQ中の人)

SCRAPの頭脳集団が明かす「コードルームからの脱出」出題の舞台裏

排他的論理和など論理演算の基礎知識、プログラマ向けエディタのキーコンビネーション、UNIXの表記法、正規表現、文字コード、JavaScriptなど、プログラマにとって基本的な素養を問う出題だが、意外とこれが難しい。そもそも、何を問う問題かに気づくまでが大変。なにしろ、出題形式そのものが謎かけなのだから。

こうした謎かけを得意とするのが、加藤隆生氏が率いるSCRAP。世界各国で、謎解きイベント「リアル脱出ゲーム」を企画・運営し、今回の「コードルームからの脱出」を手がけた頭脳集団だ。

──エンジニア向けの謎解きイベントというのは、SCRAPにとっても初めてですよね。この企画の話がきた時は、どう思いましたか。

加藤:僕らはこれまでもたくさんのメディアとのタイアップで謎解きイベントを仕掛けていますが、結構企画倒れになることもあるんです。
謎解きの基本である「人は解く理由があるからこそ。暗号やパズルを解きたがる」という基本的なモチベーションの部分が、明確じゃない時に、えてしてこういうことが起こります。

ただ、エンジニア向けと聞いたときは、これはいけると思いました。だって、エンジニアにとっての問題ということは、一種の暗号(Code)を解くような作業じゃないですか。エンジニアは謎を解く理由を常に持っている人たち。
しかも、出題が超難問とあれば、きっと勇んで参加してくれるんじゃないかと思ったんです。

今回の企画は、最初から対象者はITエンジニア、しかもCodeIQ上での出題ということで、舞台が明確に設定されていた。つまり、塗り絵と色鉛筆はその場に用意されているということ。だったら、あとはチャレンジするしかないんじゃないか、と。

──約2万人が参加。全問正解で脱出に成功した人は全体のわずか3%ほどでした。難易度の設定が難しかったんじゃないでしょうか。

加藤:普段の「リアル脱出ゲーム」は、基本的に知識問題は出さないというのがコンセプトなんです。中学生以上の常識があれば誰だって謎を解けるはず。ただ、今回はプログラマを意識して、プログラミングやそのベースにある数学の基本的知識があることを前提にしました。だから、プログラムを書いたことがない人には、解けない問題ばかりだったかもしれませんね。

ここまでのコンセプトづくりは僕が行って、具体的な問題づくりは、当社のディレクターの堺谷光とフリープログラマの南晃氏とが協力して担当しました。

知識だけあってもダメ。発想の大胆な転換が必要

堺谷:プログラマとひと口に言っても幅が広いですよね。ふだん慣れている言語も違うし、その知識のレベルも違う。特定の言語利用者しかわからない問題だと多くの人が答えられないので、どうするか。結果的にベーシックな論理的思考力を重視した問題になっていると思います。

最初はプログラマなら基本的に知っておくべき論理演算の出題から始めましたが、だんだん難しくなっていく。しかも、たんに試験問題のように出題するのではなく、謎解きとして面白くないときっと途中で飽きてしまう。そのあたりの工夫が大変でした。

──謎解きの面白さですか。

堺谷:たとえプログラマとしての基礎知識はあっても、それだけでは解けない。どこかで発想の転換、違うものの見方をしないと解くことはおろか、主題の意図さえ摑めない、そういう仕掛けは意識しましたね。

例えば、「暗号2」では文字数を数えて26文字あるというところから、アルファベットの文字数を連想し、さらにQWERTY配列のキーボードを思い浮かべないと、問題に入っていけない。

もちろん、プログラマの仕事環境をイメージすれば、その連想は不可能ではないわけですけれども。

普段から、こんがらがったスパゲティコードを解読するのにヘトヘトになっているエンジニアだったら、それよりもはるかにセンスのよい、こうした暗号解読に取り組んでみるのも、頭のよいリハビリになるかもしれない。

いや、もしかするとさらに頭が混乱するかもしれない……。

出題された暗号は全部で5つ。中でも最後の「暗号5」は仕掛けが複雑で、多くの挑戦者はここで挫折せざるを得なかったようだ。暗号を解く手がかりは5つ提示されるが、それぞれで得られた文字列を数列に当てはめ、一つのURLを得たとしても、そこにアクセスするとまた新たな問題が提示される。まさに一つのドアを開けると、その先にまた謎めいたドアが待ち構えている。

しかも新たに出現した暗号も、発想の限りを尽くさないと、なかなか解けない。2進法やJavaScriptはわかっても、「カエサル暗号(シーザー暗号)」を知らないと、正解には辿り着けない、という具合だ。

謎の出題者・南氏はWeb系プログラマ

このあたりに来ると、頭がしびれそうになった挑戦者も多いのではないだろうか。

堺谷ディレクターと共に、実際の問題作成に当たったフリープログラマの南晃氏は、今回の暗号作りの難しさを語ってくれた。

「あくまでも“謎解き”なので、クイズのように単に知識を問うものではなく、類推や推定、パズル的要素を盛り込むのには苦労しました。さらに、最初から難易度の高い出題を求められていたので、エンジニアの知識の内、基礎的なものから実務的なものまで、いろいろと思い浮かべ、幅広い連想と発想が必要なものに出題を絞り込みました。問題作成に1カ月はかかりましたね」

南氏の普段の仕事はモバイル向けWebサイトやEC系のWebサイト構築が多い。C、PHP、Perlに習熟するほか、データベース設計を得意としている。プライベートではプログラミングによる計算問題の解決を目的とした「プロジェクト・オイラー(Project Euler)」で問題を解くのを趣味としている。また、「リアル脱出ゲーム」についてもかなりのヘビーユーザーで、謎マニアの中では知る人ぞ知る有名人らしい。

もし次回があるとしたらどんな謎解きイベント?

「『リアル脱出ゲーム』はエンジニアにファンが多いんです。僕のTwitterフォロワーもエンジニアが多くて、PCの設定で困っているとすぐに教えてくれます。謎解きイベントはあくまでもエンタティンメントであり、創造活動であるコーディングと全く同じとはいえませんが、どこかに共通点があると思います」と、加藤氏は初のエンジニア向けイベントを振り返る。

もし次回があるとしたら…。南氏はこう回答している。
「リアルと連動した謎解きというのも面白いんじゃないでしょうか。パズルを解きながら、監視カメラなどを遠隔操作したり、ロボットの行動を簡易言語で作成したり…とかね」

こうなると脱出ゲームも、より“エンジニアっぽく”なってくる。多少予算はかかるかもしれないが、東京ドームにITエンジニア数万人が集合し、PCやスマホ片手にドーム内を駆け回り、出題されたパズルをハックしながら、マウンド上にそびえ立つ巨大ロボットを動かす──そんなイベントが実現したら、ぜひまた参加していただきたい。

(執筆:広重隆樹/撮影:平山諭)

「コードルームからの脱出」するための暗号とは?正解発表と解説

それではいよいよ「コードルームからの脱出」の正解と解説を発表したいと思う。

暗号 1 XOR(排他的論理和)

(+) この記号は XOR(排他的論理和)を表します。

アルファベットや数字を、電卓などでよく見かける形式で考えてみます。各文字を7本の線で表し、どちらか片方だけで使用されているものだけを抽出します。両方とも使われているものは消えます。

H(+)3を計算すると、右側のタテと中央のヨコが消え、左側のタテと上下のヨコが残りますので、

解答はCです。

暗号 2 「、。」がヒント

まず文章が何を表しているかを考えます。右下にある「、。」が大きなヒントです。

句読点以外の文字数を数えてみましょう。10+9+7=26 文字です。これは、アルファベットの文字数と同じです。右下に「、。」があるアルファベット。qwerty配列のキーボードが連想されます。

「ろーる」の位置のアルファベットは「SIX」となるので、キーボードであることがわかります。「ばななけーき」の位置に対応するのは「COOKIE」です。解答はCOOKIEに隠されているようです。ブラウザのツールなどを使用して、COOKIEを調べると、answerという名前でbiscuitが設定されています。

これが解答です。

暗号 3 VimとEmacs

上部のUDLRHEが何を表すかを考えます。上下左右が連想できれば、HEが文頭文末であることに気づかなくても先に進めます。

vとEが何を表すかが重要ですが、上下左右との対応と合わせて考えると思いつきやすいでしょう。テキストエディタのカーソル移動キーを表していました。

VimとEmacsの上下左右文頭文末へのカーソル移動キーのリストです。

(1)と(2)の位置は、hとpですので、解答はhpです

暗号 4 UNIXタイムスタンプ

各数字の差を計算してみましょう。そうすると、共通する数字があることに気づきます。

31536000です。

この数字、見覚えはないでしょうか。31536000 = 60 * 60 * 24 * 365です。どうやらこれらの数値は時間に関係しているようです。
時間と関係のある数値といえば、タイムスタンプが連想されます。

UNIXタイムスタンプだとして時刻に変換してみましょう。

1972/07/01 08:59:59
1981/07/01 08:59:59
1982/07/01 08:59:59

などとなります。(JST)

これらの時刻を検索してもわかりますが、課金システムやGPS、バッチ処理などに携わったことのある方ならピンときたのではないでしょうか。この時刻、すべて閏秒(うるう秒)が発生した時刻です。

解答は「うるう秒」です。

暗号 5 数字列の意味

まずは、上部に表示されている数字列の意味を考えましょう。

情報1により、先頭がawscloud-codeiqであり、末尾がamazonaws.comであることがわかります。数字列と比較してみると、文字数と記号がぴったり一致していることに気がつきます。

末尾が.comであるので、どうやらドメイン名のようです。他の情報からドメイン名を復元してみましょう。

情報2は正規表現です。それぞれの条件を丁寧に解読すると、”honban”が必ず含まれている文字列がマッチします。

情報3はちょっと難問でした。コメントを見ればいいのですが、どこのコメントを指しているのでしょうか。

いろいろ探してみると、その画像そのもののコメントに隠されていました。tEXtチャンクと呼ばれる領域を調べると、

435489654.ap

という文字列が得られます。

情報4は漢字の計算です。

漢字を計算できる数値に変換できればよさそうですね。漢字と数値といえば、文字コードです。文字コード表から該当する漢字を探してみましょう。

すると、「壱」と「一」の差が 1、「参」と「三」の差が2、などと、ぴったり計算できることがわかります。

なお、JIS、SJIS、EUCのどれでも対応していますが、Unicodeでは計算が合いません。まあ、勘弁して下さい。「僕 – 1」は「北」、「桃 – 1」は「東」ですので、英訳した解答は”northeast”です。

情報5は、問題文を見た瞬間に閃いた方も多かったことでしょう。

メタ構文変数で挟まれた文字を抽出する、という問題でした。foo,bar,baz,quxに挟まれているのは”elb”ですので、解答は”elb”です。

さて、これれの情報で得られた文字列を、数字列に当てはめてみましょう。

文字数に合致する箇所を置換するとこのようになります。

awscloud-codeiq-honban-435489654.ap-northeast-1.elb.amazonaws.com

“1”の部分の情報がありませんが、このままで試してみましょう。

このドメインにアクセスすると、新たな問題が表示されました。まだ先がありそうです。

さて、80に設定されたpを101倍し、wgetしろという指示が書いてあります。さらに、key()で「カエサル」すればよいようです。

順番に解いてみましょう。

pとは何でしょう。80と8080という数値でわかるかもしれません。

検索してもたどり着けますが、これはポート番号を表していました。同じドメインにポート番号8080でアクセスしてみると、暗号文と解答入力欄が表示されます。

カエサルとは何でしょうか。

暗号の基礎知識があれば、カエサル暗号(シーザー暗号)を指していることがわかったことでしょう。どうやら暗号文を何文字かずらせば復号できそうです。

その復号化キーが key()でわかります。末尾に括弧がついていることから、これは関数ではないかと予想できます。関数を実行すれば、復号化キーが手に入りそうです。

では、どうしたら関数が実行できるのでしょうか。Webブラウザで実行できる関数といえば、そう、JavaScriptですね。

ブラウザのコンソールなどで key()を実行してみましょう。

すると、二進法らしき数値が出てきます。素直に十進数に変換してみると、円周率であることがわかります。

さあ、情報はそろいました。暗号文を円周率の各桁の数値でずらしてみましょう。すると、次の文字列が出てきます。

Answer is in X-Code

さあ、終わりが見えてきました。解答はどうやらX-Codeにあるようです。X-Codeは、一体どこにあるのでしょうか。

それは、実はhttpヘッダにありました。wgetやツールを使って調べてみましょう。

X-Codeというヘッダが見つかります。ここに書かれた文字列が解答でした。これを送信すれば、脱出成功、クリアとなります。

また、この謎の文字列はある文章をbase64エンコードしたものです。

これをデコードすると、

The code has been solved!

となります。この文章を送信しても同じくクリアとなります。

脱出成功者と脱出タイム

おめでとうございます!脱出成功者のみなさまです。上位85名の方のニックネームと暗号5の脱出タイムを発表します。

shtd18様 (0:00:18)
eigodoo1様(0:00:20)
Nosuke_home様(0:00:22)
aftereffector様(0:00:30)
nunpoi様 (0:00:30)
npi210様 (0:00:30)
altrouge_of_9th様(0:00:31)
Pikaho様 (0:00:35)
sheeda様(0:00:40)
onsen_fever様(0:00:41)
codeiq2様(0:00:47)
hikasyuu様(0:00:48)
orbital_blaze様(0:00:49)
kobachi様(0:01:03)
k_pi_wless様(0:01:29)
rhizomeweb様(0:02:00)
Nyokki_orz様(0:02:07)
debiru様(0:03:13)
moondog_cafe様(0:04:40)
saito_ta様(0:04:42)
hirokashioya様(0:05:25)
mesttesthoge様(0:05:27)
R150U様(0:05:35)
dekai_babah様(0:06:35)
kuroshika_9696様(0:10:25)
nekon様(0:12:17)
ks_kroy様(0:14:38)
nozomi_500k様(0:20:57)
tomstay様(0:22:32)
ozawa1225n様(0:27:35)
dai_00様(0:30:43)
amagitakayosi様(0:37:09)
macha_chako様(0:39:45)
sakakitamaki様(0:43:03)
kuma_kashimo様(0:49:54)
crowther_bot様(0:53:00)
tomheloooo様(1:03:19)
nureusa様(1:05:53)
evangelupa様(1:06:49)
i_ndu_sb_unm_ei様(1:15:20)
toriko1983様(1:30:44)
onfi様(1:47:30)
rdmmtd様 (1:48:17)
nosa_monotory様(1:52:14)
wm08wm様(1:58:18)
MesserArche様(2:04:10)
testfortom様(2:06:14)
sskwwskwww様(2:10:5)7
syonbori様(2:11:12)
NecoModoki_FFXI様(2:20:42)
kcrt様(2:20:57)
nobby様(2:24:37)
TeXTeX
様(2:35:17)
icl_bomb01様(2:37:06)
ojunn様(2:37:57)
niss_0024様(2:45:00)
childArray様(2:47:08)
ABCanG1015様(2:48:45)
AKi12akiaki様(2:55:04)
fuji_tea様(2:55:34)
yodaremangetsu様(3:06:19)
gigapuwa様(3:06:48)
KoorKey様(3:10:14)
1KAK2様(3:14:05)
sato__ken様(3:16:42
katuneko様(3:29:18)
kapipantsu様(3:38:39)
naichilab様(4:03:08)
mo_men_14様(4:10:03)
h_kagotani様(4:30:37)
masaofujimura様(4:38:14)
kaipu様(4:44:25)
nanndemoiiser様(5:06:43)
kikivac様(5:42:06)
motonone様(6:02:26)
amadarain様(6:12:10)
paka65690941様(6:42:19)
minasa_様(7:41:53)
syu_to様(7:46:24)
antimon2様(9:37:09)
runicalp様(10:28:18)
kiokye様(11:24:59)
n_hyon様(35:49:10)

挑戦していただいたみなさま、ありがとうございました!
引き続き、CodeIQの問題でもお楽しみください。

CodeIQコード銀行にあなたのコードを預けてみませんか?

  • CodeIQコード銀行ではあなたのコードを財産と考えます。
  • お預かりいただいたコードは、CodeIQコード銀行がしっかり評価し、フィードバックいたします。
  • 当コード銀行にお預けいただいたコードは、企業がみてスカウトをかける可能性があります。
  • 転職したい方や将来転職することを考えている方で、今の自分のスキルレベルを知りたい方はぜひ挑戦してみてください。
  • 企業からスカウトがきたら困る人は挑戦しないでください。

興味を持った方はこちらからチャレンジを!

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

■この記事を書いた人

avatar

馬場美由紀 (CodeIQ中の人)

エンジニアの勉強会やイベントレポート担当。技術やキャリアに関するエンジニア向けお役立ち情報もお伝えしていきます。面白い情報があったら教えてね!酔ったら記憶なくす記憶飛部所属。Twitter:@miyaq

■関連記事

3人の技術イベント主催者に聞いてみた!エンジニアがコミュニティ活動をする理由... DevRel Meetup in Tokyoを運営する中津川氏 DevRel Meetup in Tokyoは、エヴァンジェリスト、DevRel活動を行っている方が集まり、知見を共有したり情報交換をしたりするコミュニティ。中津川氏が代表取締役を務める株式会社MOONGIFTのビジネスは「DevRe...
アプリで治療する医療の未来を切り拓く─医師を兼任するキュア・アップCTO鈴木晋は何を夢見るのか... JavaScriptへの愛を熱く語るエンジニアは現役の医師でもあった 最近になって、スマホ・アプリによるガイダンスが生活習慣病の予防などに効果があることが知られ始めているが、キュア・アップはこうした考え方に基づき、ニコチン依存症治療用アプリ「CureApp禁煙」を開発・提供する医療系スタートアップ...
【謎解きプログラム】解像度に対応せよ!【dpi】解答と解説... 【謎解きプログラム】解像度に対応せよ!【dpi】 本問題は、「解像度に対応せよ!」というテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されてい...
【選択式問題】JavaScript検定RPG Array編 問題解説 #javascript... 今回の問題 今回の『JavaScript検定RPG』は『Array編』ということで、JavaScript のArrayについての問題が出題されました。 それでは以下、各問題とその解答を見ていきましょう。 問題1 配列を作る方法として適切でないのはどれ? new Array(0, 1, 2)...
【選択式問題】JavaScript検定RPG String編 問題解説 #javascript... 今回の問題 今回の『JavaScript検定RPG』は『String編』ということで、JavaScriptのStringについての問題が出題されました。 それでは以下、各問題とその解答を見ていきましょう。 問題1 文字列の特定の位置の文字を得る方法として、適切でないのはどれ? "ねこみみ"...
【選択式問題】JavaScript検定RPG ループ処理編 問題解説 #javascript... 今回の問題 今回の『JavaScript検定RPG』は『ループ処理編』ということで、JavaScript のループ処理についての問題が出題されました。 それでは以下、各問題とその解答を見ていきましょう。 問題1 for (var i = 0, s = ""; i < 5; i++) s +=...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ