The Python Challenge on Ruby

http://www.pythonchallenge.com/
Rubyで解く。激しくネタばれ注意。
ちなみにhttp://gumuz.looze.net/wordpress/index.php/archives/2005/05/09/python-challenge-solutions-part-1/Pythonの解答がネタばれ済。

レベル0

http://www.pythonchallenge.com/pc/def/0.html
画像の式(2の38乗)の値を求め、それに".html"をつけ、URLとして辿る。

irb(main):007:0> print baseurl, 2**38, ".html\n"
http://www.pythonchallenge.com/pc/def/274877906944.html
=> nil

レベル1

http://www.pythonchallenge.com/pc/def/map.html

K -> M
O -> Q
E -> G

上記がヒント(画像)、下記文字列が問題文。

g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr
amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr
ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle
qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.

これ、問題の文字列をアルファベットを2つずつ進めて読めということだな。と思った。


class Converter
@@small_case = [*('a'..'z')]

def initialize()
@small_hash = {}
for i in 0..25 # the alphabet has 26 chars @small_hash[@@small_case[i]] = @@small_case[(i+2)%26]
end
end

def convert(s)
ret = ""
s.split(//).each{|e|
ret.concat(
if e.downcase == e.upcase
e
elsif e == e.downcase
@small_hash[e]
else
@small_hash[e.downcase].upcase
end)
}
ret
end
end
はっ…Σ( ̄□ ̄;) 気が付くと、意味もなくクラスに! Java使いの業病!*1
クラス指向厨テラキモスw
その上、問題文に大文字なんてないのに大文字変換に対応している!! オーバースペック*2だ。やり杉(・A・)イクナイ!と反省。

irb(main):043:0> def increase_all_chars_twice(str)
irb(main):044:1>   a = [*('a'..'z')]
irb(main):045:1>   str.split(//).each{|e| print a.index(e)!=nil ? a[(a.index(e)+2)%26] : e}
irb(main):046:1> end
=> nil

これでいいんだ。

irb(main):050:0> increase_all_chars_twice("g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyramknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclrylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgleqrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.");print "\n"
i hope you didnt translate it by hand. thats whatcomputers are for. doing it in by hand is inefficientand that's why this text is so long. usingstring.maketrans() is recommended. now apply on the url.
=> nil

最後の"now apply on the url."が答え。

問いのURLの末尾"map.html"に、この関数を適用すると、出力は"ocr.jvon"になる。そこでURLを"ocr.jvon"にしてアクセスすると、Have you ever heard of jvon files !?とつっこまれる!!!!!!!!!

……見なかったことにして(つд∩)

もちろん、拡張子はhtmlにしましょう! ということで。

*1:Java言語の仕様上、どんなプログラムもクラスを作らないと動かない。

*2:コンストラクタで変換ハッシュテーブルをキャッシュするという小賢しい真似も本当は不要。