Daily Archive for June 12th, 2007

Ruby on TopCoder SRM 329

Ruby会議2007の余韻から醒めないまま、TopCoderのPracticeを風呂に浸かりながら解いていたりします。 僕はふだんC++を使って解答を書くのですが、はてRubyで書いたらどんなくらい簡潔に書けるもんだろ、とやってみました。

お題

TopCoder::SRM::329 VowelEncryptor

平たく言うと、

与えられた文字列の配列のそれぞれに対して、含まれる母音をすべて取り除いたものを返せ

というものです。

C++

#include <string>
#include <sstream>
#include <vector>
using namespace std;

vector <string> encrypt(vector <string> text) {
  const string vowels("aiueo");
  vector <string> ret;

  for (size_t i(0); i<text.size(); i++) {
    string target(text[i]);
    size_t size(target.size()), count(0);

    for (size_t j(0); j<size; j++) {
      bool found(false);
      for (size_t k(0); k<vowels.size(); k++) {
        if (target[j] == vowels[k]) {
          found = true;
          break;
        }
      }
      if (found) {
        count++;
      }
    }
    if (count == size) { // all vowel
      ret.push_back(target);
    } else {
      string str("");
      for (size_t j(0); j<size; j++) {
        size_t count(0);
        for (size_t k(0); k<vowels.size(); k++) {
          if (target[j] != vowels[k]) {
            count++;
          }
        }
        if (count == vowels.size()) {
          str += target[j];
        }

      }
      ret.push_back(str);
    }
  }

  return ret;
}

Ruby

def encrypt(text)
  vowels = 'aiueo'.freeze
  text.collect do |src|
    src.length == src.count(vowels) ? src : src.delete(vowels)
  end
end

問題文を読んで、解法を考え、コードに移すというときに、C++でふつうに書き下していったのが上のコードです。 それに対して、同じことを実現しているのがRubyの4行コード。

まぁ、C++による解答があまりにも泥臭すぎるし、いくぶん恣意的なきらいはありますが、 それでもRubyの簡潔さは際立つところです。 ライブラリの勝利、とも言えるかな。 それboostで、とかいうのもありだとは思いますけど。

C++脳で考えるのと、Ruby脳で考えるのとでは、ずいぶんと違いがあるように思います。

Leopard

WWDC 2007 でいろんな発表があったみたいなので、Appleのサイトをのぞいてみました。

Finderの進化とかはふーん、というところで、気になるのはTechnologyとかDeveloper Toolsですよね。

Terminal 2

  • InputManagerとCoreText をつかった多言語入出力
  • LayoutEngineを書き直したので、高速な表示になるよ
  • 新しいUIで、設定とかラクになるよ

ここにまず期待。いまのTerminal.appは遅いんですよね。

Ruby

  • RubyCocoa !!
  • RubyでもDTraceつかえます

あたりでしょうか。ZFSは?

XCode

lightweight API overview ってのが気になります。 いつもAPIリファレンスを読みながら開発してるわけですが、いまのヘルプ方式はなかなかやりにくかったりするんですよね。ディスプレイが1つだけのときには。

Xray

vTuneみたいなパフォーマンス解析ができそう。


ところで、QuartzComposerのパッチを作成するテンプレートは、まだXCodeに入らないのかな。