Wordleとは
URL:https://www.powerlanguage.co.uk/wordle/
Wordleは2021年末に公開された,巷で話題の英単語推測ゲームです.お題となる5文字の英単語が存在し,それを合計6回の試行で特定します.
回答者は一度英単語を入力すると,その単語とお題の単語のどの文字が一致しているかを知ることができ,文字も場所も一致している場合は緑,文字は合っているが場所が一致していない場合は黄,文字も場所もあっていない場合は黒で表示されます.
1日1題出題だけされ,なかなか楽しいゲームなのですが,やっぱりコンピュータにも解かせてみたいですよね.ということでWordleをPythonに解かせてみました.
5文字の英単語リストを取得する
まず,Wordleのお題になる条件である"5文字の英単語"のリストを作成する必要があります.
自分でWordleを解いてみると感じるんですが,特定の文字を使う/使わない5文字の英単語を見つけるだけでも結構難しいんですよね(私の英語力がないだけかもしれません).
今回は日本語 WordNetというサイトの"Japanese Wordnet and English WordNet in an sqlite3 database"というデータベースを用いていきます.こちらはsqlite3形式で,Pythonで簡単に利用することができます.
URL:http://compling.hss.ntu.edu.sg/wnja/
ダウンロードしたら,
import sqlite3
conn=sqlite3.connect("wnjpn.db")
cur = conn.execute("select lemma from word where lang='eng'")
for row in cur:
print(row[0])
などとすると,英単語がずらっと出力されます.今回は5文字の英単語だけが欲しいので,
import sqlite3
conn=sqlite3.connect("wnjpn.db")
cur = conn.execute("select lemma from word where lang='eng'")
for row in cur:
if (len(row[0])==5:
print(row[0])
のようにすると,5文字のものだけが得られます.初めに5文字のものだけ他ファイルに出力しておいて次からはそれを使うのでも良いでしょう.
Wordleを解かせる
準備ができたら,あとは自分の好きなアルゴリズムでWordleを解かせるだけです.これはなんでも良いですが,換字暗号解読の時に用いたアルファベットの出現頻度を参考にしました.
参考サイトURL:https://tex2e.github.io/blog/crypto/letter-frequency
各色と次に入力する英単語の比較のために以下のような関数を設定し,
def count_index(word,str_g):
count=0
for i in range(5):
if str_g[i]==word[i]:
count=count+1
return count
def count_max_length(str_g):
count=0
for i in range(5):
if str_g[i] is not None:
count=count+1
return count
def count_not_match(word,str_b):
count=0
for alp in str_b:
if alp in word:
count=count+1
return count==0
def count_match(word,str_y):
count=0
for alp in str_y:
if alp in word:
count=count+1
return count==len(str_y)
アルファベット頻度頻度順に検証していきました.
結果
今回はサーバに負荷をかけないために入力は手動で行いました.
結果はこんな感じになりました.私はそもそもPERKYなんて単語知らないですし,途中のPERCHなんかも私じゃ思いつかないアプローチで,流石って感じです.
Wordleがどこまでマイナーな単語を出題するのかわかりませんが,あまりにもマイナーな単語を選択肢から省いたり,単語そのものの出現頻度とかを利用したらもっと効率よく答えを探せるかもしれませんね.