GLAT(Google研究所適正テスト)をRubyで解いてみた
昨年の秋、Googleは、その研究所で働くのに必要な適性を調べるテストを公開した。それが、GLAT (Google Labs Aptitude Test)というもの。
http://www.google.com/googleblog/2004/09/pencils-down-people.html
GLATの日本語訳はクリオネ図鑑さんのところで公開されている。
Google GLAT: ク図鑑
いくつかの問題は、スクリプトで簡単に解けそうな感じだったんで、Rubyの練習がてらやってみた。
第1問
次の暗号化された式を解きなさい。MとEは交換することが出来ます。数字の先頭には0が来てはいけません。
WWWDOT - GOOGLE = DOTCOM
(クリオネ図鑑さんによる日本語訳を拝借してます)
ぼくのrubyのコードは、こんなかんじ。当たるも八卦、外れるも…的な、何の工夫もない解法。slice!メソッドを使いまくりな実装もかなり微妙。とりあず、Celeron 1.4GHzのPCで、だいたい1分以内に終わることが多かったです。
loop do num = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] w = num.slice!(rand(num.size)) d = num.slice!(rand(num.size)) o = num.slice!(rand(num.size)) t = num.slice!(rand(num.size)) g = num.slice!(rand(num.size)) l = num.slice!(rand(num.size)) e = num.slice!(rand(num.size)) c = num.slice!(rand(num.size)) m = num.slice!(rand(num.size)) if (g==0 or d==0 or w==0) next end google = g * 100000 + o * 10000 + o * 1000 + g * 100 + l * 10 + e wwwdot = w * 100000 + w * 10000 + w * 1000 + d * 100 + o * 10 + t dotcom = d * 100000 + o * 10000 + t * 1000 + c * 100 + o * 10 + m if (google + dotcom == wwwdot) print google, " + ", dotcom, " = ", wwwdot, "\n" break end end
第17問
任意の整数nについて、0とnの間のすべての数字を書き出す際に必要な1の個数を返す関数fがある。例えば、f(13)=6となる。ただしf(1)=1である。f(n)=nとなる、2番目に大きなnはなにか。
(またまた日本語訳を拝借。)
これは感激するほど短く書けた。
cnt = 0 1000000.times{|i| cnt += i.to_s.scan(/1/).size if cnt == i then print "f(", i, ") = ", cnt, "\n" end }