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脳で考えるのとでは、ずいぶんと違いがあるように思います。
日本語
English