Entry

プログラミングメモ - カード配り問題とか

2009年12月16日

こちらから。暇なのでやってみました。Java の話みたいだけれども C++ で。

あまりに簡単なので制限時間を10分としてやってみてください。

これ以上かかった人は

自分はかなりプログラミングができない。

とつらい事実を認識しましょう。

10分でコーディング|プログラミングに自信があるやつこい!!

で,書いたもの。

#include <iostream>
#include <string>
#include <vector>

class Cards {
public:
    Cards() throw () {}
    virtual ~Cards() throw () {}
public:
    std::vector<std::string>* deal(int numPlayers, const std::string& deck) const {
        std::vector<std::string>* v = new std::vector<std::string>(numPlayers);
        int mount = deck.length() - (deck.length() % numPlayers);
        for (int i = 0; i < mount; ++i) {
            v->at(i % numPlayers) += deck.at(i);
        }
        return v;
    }
};

void
test(int n, const std::string& d) {
    Cards cards;
    std::vector<std::string>* p = cards.deal(n, d);
    std::cout << "{";
    for (int i = 0; i < n; ++i) {
        std::cout << ((i > 0) ? "," : "") << "\"" << p->at(i) << "\"";
    }
    std::cout << "}";
    std::cout << std::endl;
    delete p;
}

int
main(int argc, char* argv[]) {
    test(6, "012345012345012345");
    test(4, "111122223333");
    test(1, "012345012345012345");
    test(6, "01234");
    test(2, "");
    return 0;
}

こゆのに時間を計るのもアレなんだけれども,全部で5分くらいかかりました。コードは長く見えるけれども,ほとんどがテストコードで実質は deal 関数の6行です。C++ に String[] 型なんつもんはないので,std::vector<std::string> で代用。ついでに例外安全(exception-safe)じゃありません。

特に何の工夫もないコードなんですけれど,ウデが分かる箇所を強いてあげると,剰余演算子(%)を使って,直線的なインデックスを周期的に繰り返すインデックスに変換する方法を知っているかだと思います。これを使わないと,if-文や余計な変数をたくさん使うことになってしまう。もっとも,これはお約束というかイディオムになっているので,プログラミングで食っている人の大多数は知ってるはず。

それにしても,あんま時間とか関係ないと思うんですよ。10分が15分になったところで,工数が大きく変わるわけでもないわけで。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN