Wordleのすゝめ

これはなに

 最近話題になっている単語当てゲーム「Wordle」を短い試行回数で解くための最適な戦略について分析したので、それについて記そうと思います。

www.powerlanguage.co.uk

 

そもそも

 Wordleとは何か、ということですが、知っている人はこの見出しはスキップしてください。Wordleとは、お題の5文字の単語を6回の試行回数の間に当てるゲームです。1日1回お題が更新され、以下の画面は2022年2月9日のお題に回答する様子です。

f:id:Copynight:20220209172401p:plain

2022/02/09

プレイヤーには、お題だと思う5文字の英単語を6回入力する機会が与えられ、1回の入力ごとに入力された文字がお題に含まれていない場合はグレーが、お題に含まれてはいるが場所が違う場合はオレンジ色が、お題に含まれている場所も一致する場合は緑色が示されます。つまり、全ての文字が緑色になればお題と一致しているということで、上記は5回目の入力で正解を引き当てることができた、というわけです。

 

分析に当たって

 とりあえず分析のためには5文字の英単語を集めないといけません。私は以下の三つのサイトから5文字の英単語を収集しました。

https://kanji.reader.bz/english/starting/
https://www.kashiramoji.com/
https://cotobasearch.com/search/

上記3サイトから取得した英単語だけで、5文字の英単語はほとんどは網羅できていると(勝手に)判断しました。本記事は技術記事ではないので、英単語取得のために書いたコードの解説はしませんが、BeautifulSoup4を用いており、Githubに上げたコードは以下の通りです。同レポジトリのwList.txtファイルに取得内容が保存されていますが、分析データとして英単語計6000語程度を用意しました。

github.com

 

分析1.n文字目における各アルファベットの出現回数

 計算に用いたのは以下のコードです。

github.com

計算結果は同レポジトリのfirst.csv~fifth.csvに保存されていますが、ここでは結果について簡潔にまとめておこうと思います。

1文字目に出現するアルファベット1位:s(694回)、2位:c(471回)、3位:b(467回)

2文字目に出現するアルファベット1位:a(1110回)、2位:o(901回)、3位:e(721回)

3文字目に出現するアルファベット1位:a(664回)、2位:i(563回)、3位:r(509回)

4文字目に出現するアルファベット1位:e(924回)、2位:a(487回)、3位:i(479回)

5文字目に出現するアルファベット1位:s(1167回)、2位:e(767回)、3位:y(649回)

 

分析2.分析1をもとに最初に入力すべき単語を考える

 上記の順位をもとに、各アルファベットに(26-順位)の点数を与えました。例えば1文字目であればsは26-1=25点、cは26-2=24点です。この点を全6000単語で計算し、最も点数が高いものは1文字目に入力したときにより多くのヒントが返ってくる期待値が高いと考えられます。計算に用いたのは以下のコードです。

github.com

結果は、"cares"と"sores"が122点で同率1位でした。

 

分析3.最初に入力すべき単語を考える2

 分析2はランキングをもとに点数をつけているので、参考にはなるものの少し大雑把な気がします。そこで、6000文字の総当たりで最初に入力した英単語のヒット文字数(つまりオレンジ色になる文字数)の期待値と、一致文字数(つまり緑色になる文字数)の期待値を計算しました。計算に用いたのは以下のコードです。

github.com

結果は、ヒット文字数期待値が最も高いのは"arise"で期待値は2.03文字でした。また、一致文字数期待値が最も高いのは"cares"で期待値は0.67文字でした。ちなみに"arise"の一致文字数期待値は0.41文字で、"cares"のヒット文字数期待値は1.89文字でした。

つまり両方が共に高い文字というのは存在しないこと、最初に入力した単語の一致文字数の期待値は高くて0.67文字程度であることを考えると、最初に入力するのは"cares"よりも"arise"の方が良いのではないかと考えました。

 

分析4.お題にたどり着くまでに入力すべき単語の解析

 a~zの各アルファベットについて、1~5文字目に出てくる回数およびそのアルファベットが使われているかどうかなどの情報を含めた6つの情報を持つ26×11二次元行列を用意し、これを判断材料に使うデータにしました。「含まれているか不明の文字」、「含まれている文字」、「場所が分かっている文字」のそれぞれに重みを用意し、データより算出した評価値と重みの積を次に入力する単語の選定に用いました。評価値には、お題にたどり着くまでの入力回数を用いることにしました。コードは以下になります。

github.com

さて、皆さんが1度は疑問に思ったことがあるである「可能性があるアルファベットを順番に入れて最短で正解にたどり着く」のと「使われるかどうか不明なアルファベットを先に潰す」のとどちらがより良い戦法か、についてですが、この解析結果によると2回目の入力は一致するアルファベットを、3回目の入力は含まれているアルファベット、4回目の入力は不明なアルファベットを含む語句を中心に入力すればよいという結果になりました。計算時間の都合で一部の語句や値でしか計算してないので、これが正しいのかは分かりません。

これに加えて、まだ可能性が残っている単語と、もうお題としてはあり得ない単語のうち、どちらから入力単語を選択するか、に関しても最適な重み計算しました。コードは以下になります。

github.com

結果だけ述べると、可能性が残っている単語から入力単語を選択する方がお題に至るまでの入力単語数が短いという結果になりました。先ほどと同じく正しい結果かどうかは知りません。

 

分析5.Wordle

 以上の結果を用いて、Wordleのお題予想を行うプログラムを作成しました。コードは以下の通りです。

github.com

このプログラムを用いて、2022/2/12のWordleを解いたところ、以下のような感じになりました。

 

f:id:Copynight:20220212002015p:plain

なかなか良い感じではないでしょうか?

5.総括や反省点など

・最初は"arise"を入力するのが最も効率よく絞り込める。

・最初は既に分かっている文字を中心に、次第に不明な文字を中心とした所謂「絞り込み」をすることで正解にたどり着きやすくなる。

スパコンなどの、計算がバカ速いコンピュータがあればもうちょっと良い解析ができたと思うので、機会があれば実践してみたい。例えば、評価基準をお題に至るまでの入力回数ではなく、可能性の残る単語数をどれだけ減らせるかにした方が良い結果が得られたと思うが、計算が膨大になりすぎる(おそらく計算に数十~数百時間かかる)ので断念した。

Python高速化の知見がないのでC++で書けばよかったな、と後から思ったが、面倒そうなので断念した。

・Wordleは非常に奥深いゲームだと感じた。

 

おまけ

Wordleを自動化したので、その備忘録を以下に記しています。続きのようなものです。

copynight.hatenablog.com