如何在c++中为wordle创建逻辑?[关闭]

nxagd54h  于 2023-03-25  发布在  其他
关注(0)|答案(1)|浏览(131)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
4天前关闭。
Improve this question
我的代码不适用于有多个字母的单词/猜测。我需要在不擦除的情况下执行,因为我的输出需要索引。我遍历单词,将索引添加到一个黄色或绿色的整数向量,然后将该向量添加到一个整数向量,这样我就有了每个猜测的位置。我错过了什么。

greenLetters.clear();
        yellowLetters.clear();
        string copy = wordle;
       

        for(int i = 0; i < guess.length(); i++){    //check if green
            if(copy[i] == guess[i]){
                greenLetters.push_back(i);
                copy[i] = '&';

            }
        }
        for(int i = 0; i < guess.length(); i++){
            if(copy[i] != '&'){
                    int index = wordle.find(guess[i]);
                    if(index != string::npos){
                        yellowLetters.push_back(i);
                        copy[i] = '&';
                    }
            }
                
            }
            
    greens.push_back(greenLetters);
    yellows.push_back(yellowLetters);

我已经尝试了很多不同的if语句,比如&& find(wordle.开始(),wordle.end(),guess[index])== wordle.end()在黄色之前,它就是不起作用。

nfzehxib

nfzehxib1#

这个问题是一个简单的输入错误。您在应该搜索copy的时候搜索了wordle。这是因为您通过将copy中的字符替换为'&'来“擦除”这些字符,因此该变量表示仍然可用的字母池是合乎逻辑的。
搜索应该是:

if (copy[i] != '&') {
    auto index = copy.find(guess[i]);  //<-- typo was here
    if (index != string::npos) {
        yellowLetters.push_back(i);
        copy[i] = '&';
    }
}

注意这里也使用了auto(或者你可以使用std::string::size_type显式)。你不应该将std::string::find的返回值转换为int,编译器应该警告你这一点。
为了好玩,这里有一个替代方法,对每个字符使用一个计数器,而不是依赖于一个“特殊”字符。

enum Color
{
    Grey, Yellow, Green
};

std::vector<Color> GetColors(const std::string& word, const std::string& guess)
{
    if (word.size() != guess.size())
        throw std::runtime_error("Invalid parameters!");
   
    std::vector<Color> colors(guess.size(), Grey);
    std::unordered_map<char, int> counts;

    // Mark green letters and count remaining letters
    for (size_t i = 0; i < guess.size(); i++) {
        if (word[i] == guess[i]) {
            colors[i] = Green;
        } else {
            ++counts[word[i]];
        }
    }

    // Mark yellow letters
    for (size_t i = 0; i < guess.size(); i++) {
        if (colors[i] == Grey && counts[guess[i]] > 0) {
            colors[i] = Yellow;
            --counts[guess[i]];
        }
    }

    return colors;
}

其工作方式是通过三遍处理。第一遍计数从计数中删除绿色字母

相关问题