- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于上下文 Wordle 是一款游戏,您必须根据特定提示通过 6 次或更少的猜测来破译 5 个字母的单词。得到的提示如下:
我正在制作一个 wordle 求解器程序,它接受一系列单词尝试并将它们从可能的单词列表中删除。
我觉得解决这个问题的最佳算法是一个黑名单,其中一个违反规则的词被从数组中删除。但如果有更好的选择,我愿意接受建议。
const text =
[
[
["N","black"],["i","black"],["g","black"],
["h","black"],["t","green"]
],
[
["b","black"],["e","black"],["l","orange"],
["o","orange"],["w","black"]
]
]
const words = "dozen,brave,apple,climb,outer,pitch,ruler,holds,fixed,costs,calls, ...etc"
const solver = (text: any) => {
this.resultingWords = words.split(",").filter(word => {
word = word.toUpperCase()
for (var i = 0; i < text.length; i++) {
for (var j = 0; j < 5; j++) {
let currentText = text[i][j]
currentText[0] = currentText[0].toUpperCase()
if (currentText[0] == '') { continue }
if (currentText[1] == "green" && (word[j] != currentText[0])) {
return false
}
if (currentText[1] == "black" && word.includes(currentText[0])) {
return false;
}
if (currentText[1] == "orange" &&
(word[j] == currentText[0] || !word.includes(currentText[0]))) {
return false
}
}
}
return true
})
}
我遇到的问题是,如果一个单词有多个相同的字母,其中一个是绿色或橙色匹配项,而另一个是黑色。由于我编写算法的方式,我没有得到任何结果。
正确解决这个问题的方法是什么?
黑名单过滤方式是最好的解决方案吗? (与白名单相反)。
最佳答案
您需要匹配成对的字母(一个来自猜测,一个来自 secret 词)并将它们删除,这样它们就不会用于任何其他匹配。
您不能从“黑色”中得出结论,相应的字母根本没有出现在解决方案中。当在猜测中两次使用同一个字母时,一个可能会匹配(橙色或绿色),而另一个可能会匹配黑色。
我建议管理目标词的出现次数。黑色指示表示您知道某个字母的最大 出现次数(可能为 0)。当您获得绿色/橙色指示时,您知道出现的最小次数(可能会更新最大次数以使其不一致)。
我做了一个小实现,具有以下特点:
Game
类管理密语的选择;对猜测给予反馈;并给出游戏是否结束的指示(在 6 次猜测或正确猜测之后)
play
函数,它根据 Game
实例的先前反馈选择一个单词,并将其作为猜测提交,并重复该过程直到游戏结束结束了。
play
逻辑总是会(随机地)做出与游戏中收到的所有反馈一致的猜测。注意:这不是最佳策略。例如,5 个字母中有 4 个可能是绿色的,但可能需要多次尝试才能找到剩余的字符。
play
逻辑根据它获得的所有反馈构建一个正则表达式,并且仅使用该正则表达式过滤单词。
代码如下:
class Game {
#solution; // Private
constructor(words) {
this.#solution = words[Math.floor(Math.random() * words.length)];
this.turnCount = 0;
this.state = "playing";
}
guess(guessed) {
if (guessed.length !== 5) throw "Invalid length";
if (this.state !== "playing") throw "Game is already over";
this.turnCount++;
let attempt = [...guessed];
let correct = [...this.#solution];
attempt.forEach((ch, i) => {
if (correct[i] === ch) correct[i] = attempt[i] = null;
});
this.state = !attempt.some(Boolean) ? "won" : this.turnCount >= 6 ? "lost" : "playing";
return attempt.map((ch, i) => {
if (ch == null) return [guessed[i], "green"];
let j = correct.indexOf(ch);
if (j >= 0) {
correct[j] = null;
return [ch, "orange"];
}
return [ch, "black"];
});
}
}
function play(words) {
let game = new Game(words);
let allowed = Array(5).fill("abcdefghijklmnopqrstuvwxyz");
let letters = {}; // Letters with their minimum and maximum frequency
while (game.state === "playing") {
let regex = RegExp(Object.entries(letters).map(([ch, {min,max}]) =>
max ? `(?=^[^${ch}]*(?:${ch}[^${ch}]*){${min},${max}}$)`
: `(?!.*${ch})`
).join("") + allowed.map(s => "[" + s + "]").join(""), "i");
words = words.filter(word => regex.test(word));
// Pick a random word from the list of potential candidates
let word = words[Math.floor(Math.random() * words.length)];
let result = game.guess(word);
console.log(words.length + " options. Guessing: " + word + " - feedback: " + result.map(([ch, color]) => color[0]).join(""));
letters = {}; // This always starts from scratch
result.forEach(([ch, color], i) => {
if (letters[ch]) {
letters[ch].max = color === "black" ? letters[ch].min : Math.max(++letters[ch].min, letters[ch].max);
} else {
letters[ch] = color === "black" ? { min: 0, max: 0 } : { min: 1, max: 5 };
}
allowed[i] = color === "green" ? ch : allowed[i].replace(ch, "");
});
}
console.log("Game over. I " + game.state + " after " + game.turnCount + " attempts.");
}
const words = "dozen,brave,apple,climb,outer,pitch,ruler,holds,fixed,costs,calls"
.match(/\w+/g);
play(words);
关于javascript - 为什么我的 Wordle 解算器在出现重复字符时会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70982118/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!