Wordle已经存在一段时间了,我认为没有必要解释它是什么以及如何玩它。
请记住,你找到的 "赢家起始词 "取决于:
1.你挑选评估为可能的最佳单词,
2.你试图预测和测试的单词,
3.根据挑选的种子集,随机挑选猜测的有效单词,以选择这些单词
然而,它给了我们一个胜利者的解决方案。
1.安装和加载lares
运行install.packages("lares") ,然后,用library("lares") 加载它。从现在开始不需要更多的软件包了。
2.选择你的起点
让我们挑选一些 "好词",看看哪些词是最好的。我就不多说了,但我根据字母的位置频率设置了几条规则来设定这些初始词。有48个词符合这些过滤器的要求。为了这个目的,我使用了我以前为图书馆开发的一些旧的拼字函数。
some_words <- scrabble_words(
language = "en", # for English words
tiles = "ESAORILTNU", # 67% cumulative letters
force_n = 5, # comply Wordle universe of 5 letter words
force_start = "s", # 16% words start with S
force_str = "e")$word # most frequent letter
sort(toupper(some_words))
我们可以对其中一些进行采样,手动挑选我们最喜欢的,或者干脆全部使用,如果你有足够的耐心进行模拟:
best_words <- toupper(some_words)
现在,我随机挑选了10个我们要猜的词,从我们挑选的 "最佳词 "开始。我们用的越多,它就越能代表宇宙中的单词(大约是13K个5字母的单词)。
set.seed(2) # For reproducibility (same results)
test_words <- toupper(sample(wordle_dictionary("en"), 10)); test_words # Words to guess randomly picked
最后,我们想在每个最佳单词和测试单词的组合上测试多少种不同的随机选取方案:
seeds <- 20 # Number of different random picks to check distribution
因此,如果你使用这些相同的设置,基本上预计总共会有480次迭代。对我来说,使用我的个人电脑花了大约30分钟。
print(length(best_words) * length(test_words), seeds)
3.运行模拟
现在我们已经设定了我们的起点,让我们来运行模拟。
results <- temp <- NULL
tic("wordle_loop")
for (word in best_words) {
cat(sprintf("- Seed word: %s [%s/%s]\n", word, which(word == best_words), length(best_words)))
for (objective in test_words) {
cat(sprintf("Guess %s [%s/%s] <= %s simulations: ", objective, which(objective == test_words), length(test_words), seeds))
temp <- wordle_simulation(word, objective, seed = 1:seeds, print = FALSE, quiet = TRUE)
results[[word]][[objective]] <- temp
cat(signif(mean(sapply(temp, function(x) x$iters)), 4), "\n")
}
}
toc("wordle_loop")
4.收集结果并检查获胜者
让我们检查一下排序的结果,看看最好和最差的话。
best_means <- lapply(results, function(a) sapply(a,function(x) mean(sapply(x, function(x) x$iters))))
sort(sapply(best_means, mean))
hist(sapply(best_means, mean), breaks = 30)
在这些收敛手段上有一个小范围:(5.205,5.890)。这意味着,所有这些词彼此之间的好坏都差不多。但是,注意到我们实际上可以通过这种方法轻松地从最差的词中挑选或分割出最好的词。
为了更多了解这一点,我们来研究一个随机的基准。我随机挑选了25个词(没有用 "最佳 "词的标准来选择)作为我的新best_words <- toupper(sample(some_words, 25)) 。然后,用同样的参数和测试词重新运行了所有的代码,共进行了250次迭代,得到了以下分布。(注意:这次花了18分钟)
和理论证实。鉴于给定的随机词的结果确实比较糟糕,我们确实正确地挑选了我们的第一个最佳词。现在这个范围涵盖了收敛平均值**(5.700,6.585)**。请注意,最好的随机词并不完全在最佳词的范围内,但对于少数幸运的情况。而且最好的词比最差的随机词早收敛了~1.4次猜测。因此,我们实际上可以做一些事情,用更好的词来开始我们的游戏!
最后的评论、询问和考虑
- 在软件包中还有其他wordle_* 函数,你可以作为字典使用,实际发挥,并运行模拟。看看它打印出来的漂亮的彩色结果吧。在例子中,有一个小的演示,说明你如何无限制地玩一个随机的不知名的词。

- 除非你玩了几千次,否则你可能不会有很大的区别:这更多的是一个大数字的问题(以及在猜测时聪明地选择正确的可用单词)。
- 你可以尝试用更广泛的最佳单词或测试单词重新运行这个分析,看看是否可以改进。请注意,最好的词是那些更早收敛的词,因此更低的迭代意味着。
- 预计在一个月左右,这些wordle_* 函数会在CRAN中更新(也有更漂亮的图)。
- 现在,从第二个输入词开始,就要看你的选词技巧了。请随意使用 scrabble_words() 函数检查哪些词是可用的。
用不同的 "最佳词汇 "标准进行的额外基准测试
我又做了一个实验,使用24个核心的并行计算(对于96个单词和40次迭代的情况,在~10分钟内返回结果),得到的结论和之前一样,不考虑一些异常值。参考:"ESAORILT "是最频繁的字母,按顺序排列。
1)(所有)24个包含E的单词,以S开头,使用 "ESAORILT "的任何一个字母
2)96个包含E的好词,使用 "ESAORILT "的任何一个字母
3)96个随机单词

如果你想知道那些较低的词是什么(记住随机因素),你会得到SOARE、ALERT和RAILE。而最糟糕的是什么?LOGOI,KEVEL,和YAFFS。

