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
}

とりあえず言いたいのは、「Rubyラクチン!」ってこと。