Google Code Jam 2009に登録してみた
60時間ぐらいでモンハン3にも満足して、オンラインの無料期間も終わったので少しクールダウン。
誰かに誘われるまでは、オフでも進めよう。
さて、アルゴリズムは門外漢なのだけれど、Code Jam 2009に登録してしまった。
C++の勉強になればいいなということでやってみる。
まずは過去問から。
2008年も過去問で一番古いやつから、Alien Numbers。
Alien Numbers
http://code.google.com/codejam/contest/dashboard?c=agxjb2RlamFtLXByb2RyEAsSCGNvbnRlc3RzGIP6AQw
以下、解答含むネタばれ。
(過去問でも解答公開したらまずいんだろうか??)
この問題は最初だけあってやることはとても簡単。
任意の基数で基数変換やるだけ。
でも、C++の標準ライブラリやら、変換アルゴリズム調べたりしてたら、時間かかってしまった。
そもそも、調べてやってるようではダメなんだろうけど。
// Alien Numbers #include <iostream> #include <string> #include <sstream> #include <algorithm> #include <stdlib.h> #include <math.h> using namespace std; const string translate(const string& alienNumber, const string& sourceLang, const string& targetLang) { const int sourceRadix = sourceLang.length(); const int targetRadix = targetLang.length(); int alienNumberBinary = 0; for (int i = alienNumber.length() - 1, j = 0; 0 <= i; --i, ++j) { alienNumberBinary += sourceLang.find_first_of(alienNumber[i]) * pow(sourceRadix, j); } stringstream targetNumberStream; while (alienNumberBinary >= 1) { targetNumberStream << targetLang[alienNumberBinary % targetRadix]; alienNumberBinary /= targetRadix; } string targetNumber = targetNumberStream.str(); reverse(targetNumber.begin(), targetNumber.end()); return targetNumber; } int main() { int maxLineNumber; string alienNumber, sourceLang, targetLang; cin >> maxLineNumber; for (int i = 0; i < maxLineNumber; ++i) { cin >> alienNumber >> sourceLang >> targetLang; cout << "Case #" << i + 1 << ": " << translate(alienNumber, sourceLang, targetLang) << endl; } return 0; }
一応、Large datasetのほうでもちゃんと動作します。
添削してくれたりする人はいないかな。
C++的にはこうすべき、みたいなのが聞いてみたいが過疎ブログなので期待薄。