第7回オフラインリアルタイムどう書くの参考問題の回答例。C++ で。ふたたび。

お題はこちら http://qiita.com/items/7b08b0eb9ef84d7cfe49

鍋谷さんがgroovyで使ったアイディア（ http://qiita.com/items/61f1ed377bcb903eec96 ）を先のC++のコードに反映させてみました。格納されているデータを移動させず、インデクスだけでソートするというのは、たまーにやるんですが、たまにしかやらないので、やっぱり途中でちょっと混乱しました。

```cpp:
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <algorithm>

static const int values[6][6] =
{
    { 4, 1, 4, 2, 1, 3 },
    { 7, 3, 2, 0, 5, 0 },
    { 2, 3, 6, 0, 6, 7 },
    { 6, 4, 5, 7, 5, 1 },
    { 3, 1, 6, 6, 2, 4 },
    { 6, 0, 5, 5, 5, 1 }
};


struct RowComparator
{
    const std::size_t index;

    RowComparator(std::size_t index) : index(index) {}

    bool operator () (int lhs, int rhs)
    {
        return values[lhs][index] < values[rhs][index];
    }
};

struct ColComparator
{
    const std::size_t index;
    
    ColComparator(std::size_t index) : index(index) {}
    
    bool operator () (int lhs, int rhs)
    {
        return values[index][lhs] < values[index][rhs];
    }
};

class Matrix
{
public:
    Matrix()
    {
        for(int i = 0; i < 6; ++i)
        {
            colIndexes_[i] = rowIndexes_[i] = i;
        }
    }

    int at(int row, int col) const
    {
        return values[rowIndexes_[row]][colIndexes_[col]];
    }

    void sortRowsByIndex(std::size_t index)
    {
        std::sort(rowIndexes_, rowIndexes_ + 6, RowComparator(colIndexes_[index]));
    }

    void sortColsByIndex(std::size_t index)
    {
        std::sort(colIndexes_, colIndexes_ + 6, ColComparator(rowIndexes_[index]));
    }
    
private:
    int colIndexes_[6];
    int rowIndexes_[6];
};

void test(const std::string& input, const std::string& expected)
{
    static const std::string IndexChars = "ABCDEFuvwxyz";

    Matrix m;

    for(std::string::const_iterator i = input.begin(); i != input.end(); ++i)
    {
        std::size_t index = IndexChars.find(*i);

        if(index < 6)
        {
            m.sortColsByIndex(index);
        }
        else
        {
            m.sortRowsByIndex(index - 6);
        }
    }

    std::ostringstream oss;
    for(int col = 0; col < 6; ++col)
    {
        oss << m.at(0, col);
    }

    std::cout << "input: " << std::setw(10) << input
              << "  expected: " << expected
              << "  actual: " << oss.str() << " => "
              << (oss.str() == expected ? "pass" : "failure") << "\n";
}

int main(int, char* [])
{
    std::cout << std::left;

    /* 0*/ test( "AvEx",      "305027");
    /* 1*/ test( "A",         "112344");
    /* 2*/ test( "C",         "241413");
    /* 3*/ test( "F",         "134214");
    /* 4*/ test( "u",         "236067");
    /* 5*/ test( "w",         "732050");
    /* 6*/ test( "y",         "414213");
    /* 7*/ test( "yx",        "732050");
    /* 8*/ test( "ux",        "236067");
    /* 9*/ test( "EF",        "131424");
    /*10*/ test( "DF",        "134124");
    /*11*/ test( "Au",        "055165");
    /*12*/ test( "uA",        "023667");
    /*13*/ test( "By",        "234114");
    /*14*/ test( "yB",        "114342");
    /*15*/ test( "yBy",       "357020");
    /*16*/ test( "yByB",      "350072");
    /*17*/ test( "AuBvCw",    "131244");
    /*18*/ test( "FAuFBvFCw", "300527");
    /*19*/ test( "AuBv",      "112344");
    /*20*/ test( "CwDx",      "515056");
    /*21*/ test( "FzyE",      "324114");
    /*22*/ test( "uAwDyB",    "114324");
    /*23*/ test( "zExCvF",    "073520");
    /*24*/ test( "uFxEv",     "002357");
    /*25*/ test( "DyCwB",     "076362");

    return 0;
}
```