play wordle

发布时间 2023-11-14 21:51:51作者: yukari1735

好像烂大街了。。。

这里用的词库有 \(8869\) 个词。

先形式化 wordle 游戏:给定词库 \(S\),所有词的长度为 \(5\),要求你猜一个词 \(w\),每一轮可以输入一个词 \(s\),并返回一个长为 \(5\) 的数列 \(r\)

\[r_i=\begin{cases} 0,& s_i\neq w_i,\forall j,s_i\neq w_j\\ 1,& s_i\neq w_i,\exist j,s_i=w_j\\ 2,& s_i=w_i \end{cases}\]

你需要根据 \(r\)\(6\) 轮之内猜出 \(w\)

首先我们有一个很简单的做法:我们用集合 \(T\) 保存所有的可行词汇,每次等概率随机一个词出来,并根据返回的信息把 \(T\) 中不满足的词排除掉,直到只有一个词。

这里用了 \(\text{other}\)\(\text{snail}\)\(\text{crane}\) 这样包含一些比较常见字母组合的词来作第一个,经过测试,大约 \(4300\) 个词可以在六次猜测之内得到。

仔细考虑一下,我们选择的词不同,实际上能把集合 \(T\) 缩小的程度也不同。例如同样返回是 \(\forall i,r_i=0\)\(\text{crane}\)\(\text{guggl}\) (似乎是咯咯笑的意思) 这两种词给我们的反馈就不同,不包含 \(\text{g,u,l}\) 的单词似乎很多,而不包含 \(\text{c,r,a,n,e}\) 的词则很少。

所以我们可以让这个选择的过程聪明一点,我们不妨给每个单词 \(s\in T\) 估一个价值 \(w(s)\) 表示 “选择这个单词大概能把 \(S\) 缩减的程度”,每次选价值最大的单词。

那么该如何具体量化这个价值呢?

现在我们设定一个要输出的词 \(s\),考察一下返回的 \(r\) 会是什么样子,我们知道 \(r\)\(3^5\) 种可能,通过枚举哪些词是答案,我们可以计算出返回使得返回某个特定 \(r\) 的概率的答案词汇有多少个,记为 \(f(r)\)。也就是说,询问 \(s\)\(T\) 的大小会被减少到 \(f(r)\),同时因为成为答案的单词在 \(T\) 中等概率随机,返回这个 \(r\) 的概率会是 \(\frac{f(r)}{T}\)