由于题面是英文,先给出一下中文题面
Wordle 是一款猜单词游戏,用户尝试猜测隐藏的 5 个字母。 每次猜测都会以彩色图块的形式给出反馈,指示字母是否匹配或占据正确的位置
简要:
创建一个函数,接受 5 个字母的单词,并与已知的答案进行比较,返回用户猜单词的线索
要求:
- 该函数接受两个各包含 5 个字母的字符串、一个猜测和一个答案
- 该函数返回一个由 5 个字母组成的字符串
- 返回的字符串由字母组成,每个字母对应于猜测的一个字母:“b”(黑色)表示答案中不存在该字母; “y”(黄色)表示字母存在但位置错误; “g”(绿色)表示字母存在且位于正确位置
重复项处理:
- 出现在正确位置的字母始终为绿色,包括它出现在单词中的其他位置
- 字母呈绿色和黄色的总次数小于等于它在正确答案中出现的次数相同。 该字母的额外出现被标记为“b”
- 字母从左到右进行测试
测试样例我就不翻译了)
这个函数的目标是模拟 Wordle 游戏,给定一个猜测和正确的解答,返回一个包含 “b”(黑色)、“y”(黄色)和 “g”(绿色)的字符串,用于表示每个字母的状态
首先,我们初始化一个包含五个元素的数组,用于存储每个字母的状态。初始值为 “b” 表示所有字母都是错误的
let result = ["b", "b", "b", "b", "b"];
之后我们需要遍历所猜测单词的每个字母,对比每个字母是否在正确的位置上。如果是,将结果数组相应位置设置为 “g”,表示字母和位置都正确
guessArray.forEach((letter, index) => {
if (solutionArray[index] === letter) {
result[index] = "g";
}
});
接下来再次遍历猜测的字母数组,对比每个字母是否在正确答案中但是位置不正确。如果是,将结果数组相应位置设置为 “y”,表示字母正确但位置错误
guessArray.forEach((letter, index) => {
if (solutionArray.includes(letter) && result[index] !== "g") {
result[index] = "y";
}
});
最后,将结果数组转换为字符串,并返回最终的结果
return result.join("");
但是这样我们会发现不能通过部分样例:
问题就在于我们没有处理重复出现的字母,我们一味的让位置错误的标为"y",而没有将超过数量的字母标为"b"
那我们需要统计每个字母出现的次数吗?并不需要,只要不要让他重复检测就可以了,我们匹配一个字母就“干掉”一个字母
guessArray.forEach((letter, index) => {
if (solutionArray[index] === letter) {
result[index] = "g";
solutionArray[index] = null; // 避免多次匹配相同的字母
}
});
solutionArray[index] = null;
这个语句就“干掉了”已经被匹配过的字母。solutionArray
是正确解答的字符数组,index
表示当前猜测的字母在猜测中的位置。当猜测的字母和位置都正确时,为了避免同一个字母在解答中的多次匹配,将solutionArray[index]
的值设置为null
。这样,即使该字母在解答中出现多次,只有第一次匹配时会被标记为绿色,后续匹配会被忽略。
同理,后面检测字母正确但位置错误的遍历也需要加上同样作用的语句
完整代码如下:
function resolver(guess, solution) {
// 字符串转数组
let solutionArray = solution.split("");
let guessArray = guess.split("");
// 初始化结果数组
let result = ["b", "b", "b", "b", "b"];
// 字母和位置都正确显示绿色
guessArray.forEach((letter, index) => {
if (solutionArray[index] === letter) {
result[index] = "g";
solutionArray[index] = null;
}
});
// 字母正确,位置错误显示黄色
guessArray.forEach((letter, index) => {
if (solutionArray.includes(letter) && result[index] !== "g") {
result[index] = "y";
solutionArray[solutionArray.indexOf(letter)] = null;
}
});
return result.join("");
}