Created
June 26, 2013 02:33
-
-
Save Mahito/5864318 to your computer and use it in GitHub Desktop.
任天堂 Code Puzzle
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # coding: utf-8 | |
| # 実はこの問題、デコードする文字列の先頭が | |
| # httpという文字にデコードされることに気づけば、 | |
| # プログラムの内容がわからなくても解けることになっている。 | |
| # ykkg => httpになるためには9文字左シフトしなければならない。 | |
| # このことに気づくと実は手動でデコードが可能となる。 | |
| KEY = 9 | |
| def trans_table | |
| # "A".."Z"や"a".."z", "0".."9"はレンジオブジェクトを生成する | |
| # これはに"A", "B", "C", ..., "Z"を表すオブジェクトである。 | |
| # []は配列の宣言であり、これらのレンジオブジェクトを[]で括ることで、 | |
| # レンジオブジェクトを3つ含む配列を生成している。 | |
| # 次に上で述べた配列(Array)に対してEnumerator#mapが呼ばれている。 | |
| # mapは与えられたEnumerableなオブジェクトの要素に対して、 | |
| # ブロック({})で与えられた処理を行い、その結果をEnumeratorとして返す。 | |
| # Javaの人はJavaの拡張for文やIteratorのお仲間だと思えばわかりやすい? | |
| # 今回の場合は配列の各要素r(レンジオブジェクト)に対して | |
| # Range#to_aで配列("A"から"Z"までのStringオブジェクトの配列)に変換し、 | |
| # Array#joinで配列の各要素を結合することでひとつの文字列にした配列を | |
| # alphabets変数に格納している。 | |
| # つまりalphabets = ["ABCDEFGHIJKLMNOPQRSTUVWXYZ", | |
| # "abcdefghijklmnopqrstuvwxyz", "0123456789"]となる | |
| alphabets = ["A".."Z", "a".."z", "0".."9"].map{|r| r.to_a.join} | |
| # まず先にも述べたようにEnumerator#mapが呼ばれている。 | |
| # alphabetsは上でも述べているように配列であり、 | |
| # その各要素ab("ABCD...Z"とか)に対してabそのものと、 | |
| # abをKEYで指定したサイズ文だけ左にずらしたものが配列として返ってくる。 | |
| # イメージ(KEY=3の場合) ["ABC...Z", "DEF...ZABC"] | |
| # ここでKEYが数字型であることがわかる。(ここがわからないと解けない) | |
| # なお、ここで使われているab[KEY%ab.size..-1]は、 | |
| # Stringの要素に対して先に述べたレンジオブジェクトで範囲指定をして、 | |
| # 文字列の切り出しを行っている。 | |
| # 文字列を切り出す開始位置はKEY%ab.sizeで指定されており、 | |
| # 終了位置は-1 = 文字列の最後尾が指定されている。 | |
| # 同様にab[0, KEY%ab.size]で残りの文字列を切り出し、 | |
| # これら2つを足した(左にずらした)文字列が得られる | |
| # [["A..Z", "J..I"], ["a..z", "j..i"], ["0..9", "9..8"]] | |
| # 次にArray#transposeが呼ばれているが、 | |
| # これは配列自身を行列とみなし、行列の転置を行うメソッドであり、 | |
| # これにより配列の0番目の要素に元の文字列が、 | |
| # 1番目の要素に変換後の文字列が入った配列が得られる。 | |
| # [["A..Z", "a..z", "0..9"], ["J..I", "j..i","9..8"]] | |
| # 最後に、Enumerator#mapで配列の各要素をjoinすることで、 | |
| # 文字列をデコードするための配列が得られる。 | |
| # ["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", | |
| # "JKLMNOPQRSTUVWXYZABCDEFGHIjklmnopqrstuvwxyzabcdefghi9012345678"] | |
| alphabets.map{|ab| [ab, ab[KEY%ab.size..-1] + ab[0, KEY%ab.size]]}. | |
| transpose.map{|a| a.join} | |
| end | |
| def decode(the_answer) | |
| # 渡された文字(URL)をtrans_tableで置き換える | |
| # String#trは2つ引数を受け取り、 | |
| # 第1引数で与えられた文字に一致する文字を、 | |
| # 第2引数で指定した文字に置き換える。 | |
| # 今回与えられる第1引数と第2は以下のとおりであった | |
| # arg1:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" | |
| # arg2;"JKLMNOPQRSTUVWXYZABCDEFGHIjklmnopqrstuvwxyzabcdefghi9012345678" | |
| # なお*trans_tableは乗算のメソッドではなく、 | |
| # 配列として得られるtrans_tableを展開し引数としている。 | |
| # *trans_table => *[arg1, arg2] => arg1, arg2 | |
| the_answer.tr *trans_table | |
| end | |
| if __FILE__ == $0 | |
| # デコードされたURLを表示 | |
| puts decode("ykkg://tg2.ezekveuf.tf.ag/vekvi") | |
| end | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment