忍者ブログ
「 #RECRUIT_CODE を解けてないまま解いた流れ ※ネタバレあり 」
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


リクルートホールディングス サマーインターンシップ 2014に挑戦してみました。浪人生ですが。ごめんなさい
これは、Web上でターミナルのようなものを操作して、用意された5つの暗号を解いていくというものです。詳細は実際にやってみたほうがわかりやすいと思います。
インターンシップの応募期間が過ぎたので、それぞれの問題の解法も(分かったところは)書いていきます。解答そのもののネタバレもありますので、ご注意ください。
ある程度真面目に解きましたが、チートやショートカットやその他正攻法でないと思われる解法も用いています。

挑戦開始とQ1

まずヒントにlsコマンドを使ってみようと書いてあったので、Linuxか何かの端末なんだなと
Linuxは多少使っていますが、lsコマンドとcdコマンド以外は毎回ググって調べる必要がある程度の知識しかありません。
ヒントにcatコマンドでファイルを出力できる、と書いてあったので、q1のQuestion.txtの内容を出力すると、Q1の問題が表示されました。
そもそもcatコマンドとか知らなかったので、この先大丈夫なのか、と思いましたが、結局ほとんどcatだけで最後まで進めました。
問題内容の詳細は実際のサイトで確認してください。

Q1-1は、Hintの通り、Javascriptの正規表現です。
F-12キーでChromeのJavascriptコンソールを開いて、問題文をそのままコピペで突破。

Q1-2は、左辺の2つの数を2進数化していけば、法則性が見えてきました。
真ん中の1を境にして、左側には左の数の2進数表記、右側には右の数の個数だけ0が並んでいるとか、おそらくそのような感じ。

Q1-3、これは与えられた数字を4bit化して、左右を並び替えたものが変換後の数字です。

Q1-4、ヒントにグレイコードと書いてありましたが、グレイコードが何なのかはよく知りません。
検索して5bitのグレイコード表か変換スクリプトだかを探してきて、とりあえず当てはめて突破しました。

Q1-1から1-4までで、4つの数値が得られました。
Q1の問題文は、
"Pick up characters from PATH."
だったので、PATHというものから、4つの数値に対応した文字を取ってこれば答えになるものと思われます。
pathというと、Windowsでは環境変数としてよく使用します。
Linuxでも同様のものがあるのではないかと考え、"Linux path"あたりで調べたところ、
echo $PATH
でPATHの確認ができることがわかり、PATHの取得に成功しました。
あとは適当にPythonのインタプリタなどを起動し、PATHの文字列を変数に放り込み、得られた数値の要素にアクセスすることで解答 "life" が得られました。
エンジニアらしく、最初の文字は0番目として数えないといけません。

Q2

コマンドの一覧が表示され、それに対応した数値が表として与えられます。
まず注目したのが、cdとcpのそれぞれに対応する数値の差が12であり、これはアルファベットのdとpの番号の差と一致することです。
そこで私は、少なくとも一番右の文字の文字コードと数値に関連性があると考えました。
これは間違いだったようで、aを97として数え始めてしまったためにそれ以上の法則性を見出すことができませんでした。実際にはaを0や1として調べたり、csやcmといった文字に対応する数値を求め、これとlsやrmとを比較することでルールが見出せるようです。
しかし私はこのルールを見つけることができませんでした。
代わりに、問題となっているコマンドの数値が1029、そしてrmコマンドの数値が994と、割と近いことに気付きます。
少なくとも26以上は差があるので、rの次のアルファベットであるsに見当をつけ、sa,sb,sc,...と総当たりでコマンド入力を開始。
slコマンドで汽車が走ったところで、もしやこれが正解ではと思い、案の定正解。
3回汽車を走らせると、汽車に "universe" という文字が書かれました。

Q3

ls -aオプションで、隠しファイルを見つけなければいけません。
実はQ5のヒントとして隠しファイルの存在が示唆されているのですが、同様にそれを用いなければならないQ3にそのヒントが無かったように思えるので、すぐこれを発見できたのは幸運でした。
とはいえ問題文はすべて一見して何の意味もないような文章です。
文字の出現回数を調べたり、大文字だけ取り出して並べ替えたりしてみましたが、大した成果は得られず。
時間だけを浪費した挙句、ふと文章全体を眺めたところ、答えが見えました。
文章の先頭の大文字が、順に"everything"となっていました。最初文章中のすべての大文字を取り出したり並べ替えたりしたときに気付かなかったために、かなり時間がかかってしまいました。

Q4

息抜きのゲームセンターです。すべてクリアすれば解答が得られます。
Q3で完全に詰まったと感じたので、Q3と並行して攻略しました。

Q4-1、Hit and Blow
聞き覚えはあるような気がするゲームです。数度挑戦してみましたが、どうも8回以内で当てるというのはこのゲームに慣れていない人間にやらせるべきチャレンジではないようです。
ググったところ案の定攻略プログラムが出てきたので、それに解かせて突破しました。

Q4-2、 Misere Nim
石を取っていって、最後に石を取った人が負けのゲームです。
石が2つのバージョンなら私もやったことがあります。
石が2つの場合はごく単純な必勝法がありますが、3つの場合はどうやら面倒なようです。
ググって情報を集めたところ、3つの数の排他的論理輪が0になるように石を取っていけば必勝となるらしいです。たぶん。
とりあえず書いてある必勝法の通りに取るべき石の個数を算出するプログラムをPythonで書き、それを用いて突破しました。
1手ごとに攻略関数に引数を3つ与えてやらないといけないのが一番面倒でした。

Q4-3、Misere Tic-Tac-Toe
逆マルバツゲームです。
3つ並べたほうの負けとなります。勝利条件は相手が負けるか、引き分けること。
プレイヤーは必ず先攻、つまり一つ多く石を置くことになるので、圧倒的不利です。
これが難問でした。実は解けていません。
ゲームセンターのソースコードは、問題ディレクトリに置いてあります。
そこでQ4-3のソースコードを拝借し、初期盤面に一つ石を配置する改造を施した後、コンパイルしました。
つまり相手が既に1手目を指した盤面からプレイヤー→AIと打たせることで、擬似的にAIが後攻となる状況を作り出し、それによってAIの手でAIを倒そうというわけです。
結果としては、勝てませんでした。というかプレイヤーが後攻をとると、人間の手でも普通にAIが負けます。
というわけで楽はできない様子。
知人はマルバツの全ての盤面を探索し、勝利条件を満たせる解法を導き出して突破したようです。
しかし私にそこまでの技能はないですし、なにより面倒そうです。
ここらでやる気がなくなってきました。やけになって、問題サイトのソースコードの解読を開始。
案の定"cheat"などというコマンドを発見して、ゲームセンターのすべてのゲームに勝利した状態にするチートコマンドを実行。なんとも情けない手段でゲームセンターを攻略しました。
全ゲーム攻略状態になっていたので、一番簡単だった4-1をもう一度クリアすると、解答 "ultimate" が得られました。

Q5

面倒な問題です。なんといっても解き方がさっぱりわかりません。
だいたいQ4の攻略中にチートコマンドなんてものを発見してしまったので、こんな問題を解かなくてもチートで全問題を解答済みの状態にしてしまえばいいのです。
というのも流石に味気ないので、とりあえずは攻略を開始。
この暗号を解け。
uJnuHuyofuyaHeHeyoK
隠しファイルにヒントが書かれており、こちらが問題の本筋の様子。
Hint 1:
next if (*it < 97);
97というのは、aの文字コードです。
aより文字コードの小さい文字、つまり大文字の場合に条件式が真となるものと思われます。
nextはおそらくcontinue文、つまりループを次の処理に持ち越す処理か何かだと推測。
よって大文字は無視するとか、そういった意味だと思われます。

Hint 2:
6002:1980
JIS X 6002-1980というのは、キーボードの日本語配列のもととなったもののようです。かな入力とか日本語入力に関連する事柄を示しているのでしょうか?

Hint 3:
Bil or Tim
誰だよ

Hint 4:
Alpine, Cupcake, Innsbruck, Jelly Bean
A,C,I,Jはアルファベット順ですね。Androidの10個目のバージョンのコードネームがJelly Beanだった気がします。
とはいえそれ以上はよくわかりません。

Hint 5:
2
それはどうも

Hint 6:
\prod_{k=1}^n k
数式ですね。
しかし何を示しているのかわかりません。

というわけで、ヒントの大半が意味すらわからないといった状況で、この問題を正面から解くには私の頭はあまりに弱すぎたようです。
だいたいチートコマンドの存在を知ってしまった時点で、正面から解く意欲は半減しつつあります。
よって手は動かさず、頭だけでうだうだと思考を続けましたが、当然良さそうな攻略法は思いつきません。
なんか調べたところソースコードに書かれているハッシュ値をググることで解答が得られるとかいう身も蓋もない情報は手に入りましたが、べつにチートコマンドを使えばいい話なのでちょっと違う気がします。
Twitterあたりで既に攻略した人のツイートを漁ったりしても有用そうな情報は得られず、夜も更けてきたので、風呂に入ることにしました。
風呂でぼんやりと解法について考えていたのですが、そこである情報を手に入れていたことを思い出します。


Q1からQ5までのすべての問題を解くと、最後に初期ディレクトリに最終問題の解答を入力するためのanswerファイルが出現するというものです。
5つの問題を解いたあと、さらにもう一つ問題を解かないといけないのか?
だとすれば、なんと面倒なことか。そもそも最初から6問構成にすればいいのでは。
そうでない理由があるとすれば、これまで解いた問題そのものが最終問題の内容あるいはヒントになっている、というものに他なりません。
それも、Q5だけでなくQ1からQ5まですべての問題が最終問題に繋がっていると考えるのが妥当です。
"life" "universe" "everything" "ultimate" ...?
銀河ヒッチハイク・ガイドですね。
よってQ5の解答にして、この質問を完成させるための最後の単語は"question"に他なりません。
ちなみに"question."も正解のようです。"answer"は間違いです。
そういうわけで、私は風呂に浸かりながらQ5と最終問題の解答を得たわけです。というわけで、最後の解答を入力する前にチートコマンドでタイマーリセットをかけたりしてしたり顔をしつつ、解けたのか解けてないのかよくわからないまま全ての暗号を突破しました。

Q5を正面から解く場合の解法は私には難しすぎたようです。このような推論によって無理やりスキップしてしまうことも問題の意図するところだったのではないかと思えるほどです。
拾い物のプログラムに問題を解かせたり、果てはチートコマンドを悪用したり直接答えを推測したりと無茶苦茶な解き方ですが、これが私が辿った流れです。
PR

COMMENTS
TITLE

NAME

EMAIL

HOME
Vodafone絵文字 i-mode絵文字 Ezweb絵文字PASS
COMMENT
 - MAIN - NEXT
カウンター
プロフィール
HN:
もとき
年齢:
28
HP:
性別:
男性
誕生日:
1995/09/20
RSS
FeedWind
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
最古記事
ブログ内検索
バーコード
CopyRight

Copyright(C) 2008 もとき All rights reserved.

OTHERS
Powered by [PR]
Templated by TABLE ENOCH