wordle で SQL のトレーニング
まえがき
ちょっと前に wordle というゲームが流行りましたね。
しばらくハマって遊んだあと、飽きてそれっきりでした。
最近、オープンソースな英和辞書があることを知り、しかもありがたいことに SQLite のデータが置いてあるのを見つけました。これを使うと wordle の攻略が楽になるのではと、早速試してみることにしました。
結論としては、答えに簡単にたどり着くことができてつまらなくなるものの、SQL を使った文字列検索のトレーニングにはちょうどいい題材でした。
準備
https://kujirahand.com/web-tools/EJDictFreeDL.php から ejdict.sql をダウンロードします。
sqlite3 で接続します。
$ sqlite3 Downloads/ejdic-hand-sqlite/ejdict.sqlite3
SQLite version 3.39.5 2022-10-14 20:58:05
Enter ".help" for usage hints.
sqlite> .schema
CREATE TABLE items (
item_id INTEGER PRIMARY KEY,
word TEXT UNIQUE,
mean TEXT,
level INTEGER DEFAULT 0
);
CREATE INDEX word_index on items(word);
sqlite>
items テーブルの word カラムに英単語が格納されているので、これを使いましょう。
やってみる
最初の1語はてきとーに入力します。(この問題はすでに過去のものです)
これでいくつかのヒントが得られました。
- 3文字目が
A
で 5 文字目がE
-
S
,P
,D
は含まない
これを SQL で表現するとこんな感じでしょうか。
sqlite> SELECT word,mean FROM items
WHERE word LIKE '__a_e'
AND NOT word GLOB '*[spd]*';
(snip)
COUNT をとってみると、候補が 47 個に絞られたことがわかります。
sqlite> SELECT COUNT (word) FROM items
WHERE word LIKE '__a_e'
AND NOT word GLOB '*[spd]*';
47
thane とか知らんわ〜と候補を眺めつつ、適当に BRAVE
を選んでみました。
残念。しかし新たに B
, R
, V
が含まれないことがわかりました。SQL をアップデートしましょう。
sqlite> SELECT word,mean FROM items
WHERE word LIKE '__a_e'
AND NOT word GLOB '*[spdbrv]*';
(snip)
Blake|ブレイク(『William~;1757‐1827』;英国の詩人・画家)
(snip)
おっと。wordle では固有名詞は対象外なので除外しましょう。
ejdict には品詞の分類が登録されていません。固有名詞は大文字を含む形で登録されているぽいので、a-z で検索することにします。
LIKE, GLOB ではこれを表現できないので、正規表現を使うことにします
sqlite> SELECT word,mean FROM items
WHERE word LIKE '__a_e'
AND NOT word GLOB '*[spdbrv]*'
AND word REGEXP "^[a-z]{5}$";
(snip)
だいぶ絞られました。今度は FLAKE
にしてみます
お! L
が含まれることがわかりました。さらに絞り込みます
sqlite> SELECT word,mean FROM items
WHERE word LIKE '__a_e'
AND NOT word GLOB '*[spdbrvfk]*' -- F,K も除外
AND word REGEXP "^[a-z]{5}$"
AND word GLOB '*l*' -- L がどこかに含まれているけど、
AND NOT word LIKE '_l___'; -- 2番目ではない
whale|鯨: 捕鯨に従事する 〔話〕 非常に大きい[すごい]もの (a ~ at [for, on] …の得意[熱心]な人) / (棒・むち・手などで)…‘を'打つ,打ちのめす ひどく打つ / …‘を'打ち負かす
候補は一つだけ。ということで...
やったね!
Discussion