0

推測と隠されたコードを比較して、首謀者のゲームで正確なペグと誤って配置されたペグの数を計算するために「純粋な」C++ ソリューションが提案されているGuru Of the Week の記事を見ました。

しかし、コードを使用すると

string colors("BGR"), comb(4, '.'), l(comb), guess;
typedef map<int,int> M;

struct Color
{
    Color( M& cm, M& gm, int& color )
        : cm_(cm), gm_(gm), color_(color=0) { }

    void operator()( char c )
    {
        color_ += min( cm_[c], gm_[c] );
    }
    M &cm_, &gm_;
    int& color_;
};

struct Count
{
    Count( int& color, int& exact )
        : color_(color), exact_(exact=0) { }

    char operator() ( char c, char g )
    {
        return ++cm_[c], ++gm_[toupper(g)], exact_ += c == toupper(g), '.';
    }

    ~Count()
    {
        for_each( colors.begin(), colors.end(), Color( cm_, gm_, color_ ) );
    }

    M cm_, gm_;
    int &color_, &exact_;
};

char ChoosePeg()
{
    return colors[rand() % colors.size()];
}

int main()
{
    int color, exact = 0;
    srand( time(0) ), generate( comb.begin(), comb.end(), ChoosePeg );

    while( exact < comb.length() )
    {
        cout << "\n\nguess--> ", cin >> guess;
        transform( comb.begin(), comb.end(),
               guess.begin(), l.begin(),
               Count( color, exact ) );
         cout << color << ' ' << exact;
     }
     cout << " - solved!\n";
 }

「色」番号は、提供されている例のように異なる場合でも、常に0です。コードの組み合わせ "RRBB" をハードコーディングし、"rbrr" を入力すると、期待される結果は 3 1 ですが、私の出力は次のとおりです。

guess--> rbrr
0 1

すべてのアイデアを歓迎しますか?

4

1 に答える 1

0

誤って配置されたペグ (colorコードの呼び出し) の数は、次の ctor で 0 のままでした。

Color( M& cm, M& gm, int& color )
        : cm_(cm), gm_(gm), color_(color=0) { }

int&作成者は、メンバーの初期化の前に値をリセットしました。これを修正するには、いくつかの方法に従うことができますが、最も簡単なのはcolorCountctorの値を値としてリセットすることexactです。したがってColorCountコンストラクターは次のようになります。

Color( M& cm, M& gm, int& color )
        : cm_(cm), gm_(gm), color_(color) { }

Count( int& color, int& exact )
        : color_(color = 0), exact_(exact=0) { }
于 2013-11-15T13:35:23.177 に答える