最近wordleばっかりみるのだけど、あんまり自分が解いたもの平均以下なのかどうかがわからない.
アルゴリズム作って解くと、どのくらいで解けるのかが気になったので雑に調べてみた.
アルゴリズムやwordleのルール解釈にミスがあるかもしれないので、参考程度にしてもらえれば
⚠️⚠️ wordleを解くのがつまらなくなるかもしれないので、楽しみたい方は見ないことをおすすめします ⚠️ ⚠️
↓↓
wordle solver
ロジック的には簡単なものを採用した. (高頻度な文字を含むワードから順に選び除外するアルゴリズム)
条件を厳しくしたりすると、もっと賢く解けるかもしれないので、あくまで参考程度に.
- 単語リストから文字出現頻度を調べる.
- 単語ごとに文字出現頻度の合計値を算出 (apple => aの頻度+pの頻度+pの頻度+lの頻度+eの頻度)
- 単語ごとの出現頻度合計値でソートする
- 頻度が高く、各文字がかぶらないワードを選出 (できる限り候補を絞るため)
- 選出ワードで解く
- word, answer_wordを比較して、緑(1), 黄(0), 黒(-1)の3パターンを結果として返す. 例: purse <=> sugar であれば [-1,1,0,0,-1]
- 単語リストを下記条件でフィルタリングする.
- 緑(1): 同じ文字を含み同じ位置にあるものでフィルタ
- 黄(0): 同じ文字を含み違う位置にあるものでフィルタ
- 黒(-1): 同一文字の出現数が1の場合は、該当文字を含まないようにフィルタ. (2文字以上同じ文字を含み、正解が1文字の場合、1文字目しか黄色にはならない)
- 解いた結果が[1,1,1,1,1]になるまで、4-6を繰り返す
実行
ワードリストは下記のものを採用した
## 改行文字含むので+1
$ cat corncob_lowercase.txt | awk '{if(length($1) == 6) print}' > words.txt
$ ruby solve_wordle.rb words.txt > words_result.txt
$ cat words_result.txt | awk '{s+=$2;t+=1}END{print s/t}'
4.26699
平均は4.27回だった.
上位/下位の単語を見てみる.
$ cat words_result.txt | sort -n -k2 | head
arose 1
actor 2
adios 2
adore 2
adorn 2
aesop 2
afire 2
afros 2
aides 2
aisle 2
$ cat words_result.txt | sort -n -k2 | tail
jails 10
jives 10
nines 10
sales 10
saves 10
fears 11
sails 11
wares 11
wears 12
sears 13
aroseが高頻度文字セットで互いに疎な感じっぽい.
せっかくなので、5文字以外でも調べてみた.
letters | words | mean_solves |
---|---|---|
2 | 47 | 4.17021 |
3 | 589 | 6.11545 |
4 | 2294 | 5.03313 |
5 | 4266 | 4.26699 |
6 | 6936 | 3.70804 |
7 | 9203 | 3.40563 |
3文字を境に難易度が下がっていっているというのが面白い.
3文字って略語っぽいものもありそうだ.
こうみると程よく単語数もあって、簡単すぎない5文字っていうのは丁度いいゲームバランスなのかもしれない.