WORDLEをやってみると、まあ秒で「これはプログラムで解けるのでは?」と思うわけだけど、プログラムで解いてしまっては英単語の勉強にならないということもあって、統計的にどう攻略するのが良いだろうか、という方針で考えてみた。
WORDLEのルールは単純で、6回英単語をトライして5文字からなる英単語を当てれば良いだけなのだけれど、さて最初に入力すべき単語はなんだろう?
Pythonのnltk (Natural Language Toolkit) には辞書もあるので、nltkとnltkのdataをダウンロードしておく。
$ pip3 install nltk
$ python3 -m nltk.downloader all
nltkの英単語辞書に登録されてる単語のうち、長さが5のものを抜き出して数えてみる。
#!/usr/bin/env python3
from nltk.corpus import words
word_list = [x for x in words.words() if len(x) == 5]
char_dict = {c: 0 for c in string.ascii_lowercase}
for w in word_list:
for c in w:
char_dict[c.lower()] = char_dict[c.lower()] + 1
[i for i in sorted(char_dict.items(), key=lambda x:x[1])]
まあ、案の定、aが再頻出文字となる。
a | 5879 |
e | 5019 |
r | 3640 |
o | 3372 |
i | 3365 |
s | 2954 |
l | 2848 |
n | 2827 |
t | 2807 |
u | 2333 |
c | 1878 |
y | 1870 |
d | 1703 |
m | 1655 |
h | 1639 |
p | 1508 |
b | 1397 |
g | 1319 |
k | 1121 |
w | 764 |
f | 755 |
v | 555 |
z | 308 |
j | 251 |
x | 241 |
q | 102 |
上位5つの文字はAEROIなんだけども、どうアナグラムしても英単語にはならない(同じ文字を複数回使うことはできるが最初に入れるのは効率が悪い)。では6位のSを使えば、どうなるかというと、
- RAISE (3, 1, 5, 6, 2 = 17)
- AROSE (1, 3, 4, 6, 2 = 16)
となるので、AROSEが最初に入力すべき英単語だろう。
1つ目の単語としてAROSEを入力して、
- 位置があっていた文字
- 正解に含まれる文字
- 正解に含まれない文字
が得られた後、2つ目の単語として入力すべき英単語は上のPythonをちょいちょいと弄って正規表現を使えば一気に絞り込めるわけだが、ここはグッと我慢してそれをやらずに、統計的に確率が高い候補として挙げられる文字のリストだけ作ってみる。
#!/usr/bin/env python3
import string
from nltk.corpus import words
word_list = [x for x in words.words()]
char_dict = {x: {c: 0 for c in string.ascii_lowercase} for x in range(5)}
for w in word_list:
for i, c in enumerate(w):
char_dict[i][c.lower()] = char_dict[i][c.lower()] + 1
print(char_dict)
こんな感じのPythonを実行して得られるリストは以下の通りだった。
1文字目 | 2文字目 | 3文字目 | 4文字目 | 5文字目 | |||||
---|---|---|---|---|---|---|---|---|---|
s | 1346 | a | 1837 | a | 1040 | e | 1384 | e | 1472 |
a | 810 | o | 1377 | r | 1005 | a | 1162 | y | 1379 |
c | 768 | e | 1243 | i | 872 | i | 964 | a | 1030 |
b | 750 | i | 999 | o | 798 | n | 635 | t | 760 |
t | 695 | u | 889 | n | 789 | r | 605 | r | 743 |
p | 613 | r | 836 | e | 666 | o | 586 | n | 739 |
m | 543 | l | 618 | l | 644 | l | 577 | l | 599 |
g | 471 | h | 568 | u | 563 | t | 572 | s | 525 |
d | 467 | n | 396 | t | 523 | s | 548 | d | 469 |
r | 451 | t | 257 | s | 422 | u | 511 | h | 431 |
f | 411 | p | 204 | m | 410 | c | 454 | o | 395 |
l | 410 | c | 175 | d | 364 | g | 333 | i | 348 |
h | 322 | y | 160 | b | 316 | d | 313 | k | 339 |
w | 308 | m | 159 | g | 312 | m | 309 | m | 234 |
k | 286 | w | 139 | c | 292 | k | 247 | c | 189 |
u | 276 | s | 113 | p | 271 | p | 240 | p | 180 |
n | 268 | d | 90 | k | 183 | b | 189 | g | 140 |
e | 254 | b | 66 | v | 177 | h | 179 | x | 96 |
o | 216 | k | 66 | w | 164 | v | 157 | u | 94 |
i | 182 | g | 63 | y | 145 | f | 124 | f | 83 |
v | 167 | v | 48 | h | 139 | z | 99 | b | 76 |
j | 166 | x | 39 | f | 112 | y | 95 | w | 61 |
y | 91 | z | 27 | z | 84 | w | 92 | z | 32 |
z | 66 | f | 25 | x | 69 | j | 31 | v | 6 |
q | 63 | q | 15 | j | 40 | x | 15 | j | 1 |
x | 22 | j | 13 | q | 22 | q | 1 | q | 1 |
これらを合わせて少しだけ考えてみると以下のようになるんじゃないかと。
- AROSEで1つもヒットしなかった場合、UNTILが次の候補
- AROSEでAの位置が正解、他は外れた場合、ADULT辺りがベスト
- AROSEでAが含まれるが、他は外れた場合、CANTY?
といった具合になる。
上の表を駆使して、君の、君だけのWORDLE攻略を楽しんで欲しい!w
追記:さらに考えてみた。
追記:もっともっと考えてみた。