読者です 読者をやめる 読者になる 読者になる

北海道苫小牧市出身の壮年PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

任天堂の #codepuzzle がすばらしい出来だった

任天堂のコードパズルを裏までクリアしたので感想を。

Let's take tea break.

Code Puzzle / Nintendo

これ、実は経緯を知らずにやってたのだけどPyconJP2012の配布物に入っていたものらしい*1任天堂公式の配布物だけあって、クオリティが非常に高い。序盤は簡単な問題から始まり、通常のクリアまでは1時間半程度。前の問題を踏まえて徐々にレベルが上がる。サイトのセンスも良いし、ヒントも適度に充実していて、非常に楽しく遊べた。

その後、あることをすることで裏ルートが始まる。いわばこの裏ルートからが本当のゲームの始まりで、ここからいきなりヒントがなくなって投げ出される。それでも、じっくり考えればわかるという絶妙な難易度調整。わかったときの「ああ、そうか」と思えるのも、きちんとした伏線がいろいろ貼られている賜物だろう。

最終問題ははっきり言ってこの手の*2問題に慣れている人じゃないと難しいと思う。しかし、最終問題も含めて全体としてストーリー立てがきちんとできており、難しい中にも攻略のポイントが要所要所にきちんと隠されているのが憎らしい。古き良き時代のアドベンチャーゲームを遊ぶが如く、最後まで楽しくプレイさせてもらえた。


ちなみに、裏のクリアに要したのは10時間程度。途中Cに浮気をしたけど*3、最終的にはすべてPythonだけで解いた。そのうち、最後の問題で8時間程度かかっている(笑)。17日現在で裏クリアしている人は他に一人しか観測できなかったけど、その方も最後に5時間かかったと呟いてるので、まあ平均的にはそれくらいかかるのかなあと思った。


【9/19追記】このエントリ見てる人少なそうなので、酔った勢いで攻略のヒントを書いておく。自力で解きたい人はこれより下を見ないこと


























問題1

総当たりで十分解ける。スクリプトを作れ。

問題2

ヒントを含めた指示の通りに実装するだけ。職業プログラマならできないと・・・。

問題3

入力BOXが動的に動くってことは、JavaScriptで実装されているはず。それならば、ある方法でソースを入手できるのではないだろうか。

問題4

総当たりだと少し苦しいが、問題3で手に入れたルールによれば1つに文字に対して元の文字は2通りにまで絞れる。この数なら総当たりもできる。

関数名はその関数の機能を表す重要な手がかりとなる。わからない単語はググればよい。

裏ルートへのヒントの行き方

分岐はクリア後にある。ヒントへのリンクを探そう。

裏ルートへのヒントの解読(1)

この紙、どこかで見たことがあるはず。紙が破れているということは・・・?

裏ルートへのヒントの解読(2)

俗にいう"赤ペン"のヒント。ヒントは赤ペン周りだけで、元のコードは無視してよい。また、このヒントのURL自体がヒントになっているのだが、このままでは常人にはわからない。赤ペンの記述を元にさらにURLを変換すると・・・?

裏ルートへのヒントの解読(3)

ヒントの通り愚直に "take away" する。"break"もソースコードを見れば納得できるはず。ただし、"ひと変換"の前後の2回必要。1回しか変換しないと、「おしい」と言われてしまう。

最終問題

まずはコード全体を読み、すべきことを見つける。コードの実装でここまでの実装だけでは足りてない部分もこの段階で実装して埋めておく。開発者によるコメントは、いつでもコードを読み解くヒントになる。

通常ルートの問題1は総当たりで解けたが、最終問題の規模になると総当たりでは解けない。が、幸いなことにこの量であれば逆算する関数を作ることはできる。方法はとても専門的なので、コードを読み解いた情報を手がかりにGoogleで調べるとよい。

暗号化の中間の過程がprintされているのはなぜか。それが、この問題を解くためのヒントになるからだ。さまざまな文字を試しに暗号化して過程を見てみることで、この暗号化を解くのに非常に役に立つ重要な規則性を見つけることができるはず。

通常ルートの問題4は(ある程度枝切りをした)総当たりでも十分解けるが、実はちょっと考えれば一意に答えを算出する関数を作ることができる。この規模の量になると総当たりは厳しいので、この関数の作成は必須。

モールス信号に使えるのはiとIだけだ。Tが出てくることはない。このことからバックトラックさせながら可能性を逆算すれば、最終的な答えを得ることができる。

*1:恐らくリクルート系のパンフじゃないかと

*2:どの手の、かは秘密:p

*3:これが大きな失敗でもあったw