◻️

wordle で SQL のトレーニング

2023/07/24に公開

まえがき

ちょっと前に wordle というゲームが流行りましたね。

しばらくハマって遊んだあと、飽きてそれっきりでした。
最近、オープンソースな英和辞書があることを知り、しかもありがたいことに SQLite のデータが置いてあるのを見つけました。これを使うと wordle の攻略が楽になるのではと、早速試してみることにしました。
https://kujirahand.com/web-tools/EJDictFreeDL.php

結論としては、答えに簡単にたどり着くことができてつまらなくなるものの、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~;17571827;英国の詩人・画家)
(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